From b7983d4c200fc1b713b8adc88fa62513b0dbc901 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 00:45:13 -0600 Subject: [PATCH 01/26] First pass --- zone/bot_command.cpp | 2 +- zone/client.cpp | 4 +- zone/client.h | 283 +++- zone/client_packet.cpp | 12 +- zone/client_process.cpp | 4 +- zone/command.cpp | 2 +- zone/entity.cpp | 6 +- zone/main.cpp | 10 +- zone/questmgr.cpp | 28 +- zone/tasks.cpp | 3343 ++++++++++++++++++++++----------------- zone/tasks.h | 292 ++-- zone/worldserver.cpp | 16 +- zone/zone.cpp | 2 +- 13 files changed, 2334 insertions(+), 1670 deletions(-) diff --git a/zone/bot_command.cpp b/zone/bot_command.cpp index 1dcebe5fc..f7dbdd972 100644 --- a/zone/bot_command.cpp +++ b/zone/bot_command.cpp @@ -76,7 +76,7 @@ extern QueryServ* QServ; extern WorldServer worldserver; -extern TaskManager *taskmanager; +extern TaskManager *p_task_manager; void CatchSignal(int sig_num); diff --git a/zone/client.cpp b/zone/client.cpp index 1f1ab10b9..22bdb333e 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -258,7 +258,7 @@ Client::Client(EQStreamInterface* ieqs) tgb = false; tribute_master_id = 0xFFFFFFFF; tribute_timer.Disable(); - taskstate = nullptr; + task_state = nullptr; TotalSecondsPlayed = 0; keyring.clear(); bind_sight_target = nullptr; @@ -452,7 +452,7 @@ Client::~Client() { // will need this data right away Save(2); // This fails when database destructor is called first on shutdown - safe_delete(taskstate); + safe_delete(task_state); safe_delete(KarmaUpdateTimer); safe_delete(GlobalChatLimiterTimer); safe_delete(qGlobals); diff --git a/zone/client.h b/zone/client.h index cc461bc22..41b384cdc 100644 --- a/zone/client.h +++ b/zone/client.h @@ -86,7 +86,7 @@ namespace EQ #define XTARGET_HARDCAP 20 extern Zone* zone; -extern TaskManager *taskmanager; +extern TaskManager *p_task_manager; class CLIENTPACKET { @@ -1006,7 +1006,7 @@ public: uint32 GetSpellIDByBookSlot(int book_slot); int GetNextAvailableSpellBookSlot(int starting_slot = 0); inline uint32 GetSpellByBookSlot(int book_slot) { return m_pp.spell_book[book_slot]; } - inline bool HasSpellScribed(int spellid) { return (FindSpellBookSlotBySpellID(spellid) != -1 ? true : false); } + inline bool HasSpellScribed(int spellid) { return FindSpellBookSlotBySpellID(spellid) != -1; } uint16 GetMaxSkillAfterSpecializationRules(EQ::skills::SkillType skillid, uint16 maxSkill); void SendPopupToClient(const char *Title, const char *Text, uint32 PopupID = 0, uint32 Buttons = 0, uint32 Duration = 0); void SendFullPopup(const char *Title, const char *Text, uint32 PopupID = 0, uint32 NegativeID = 0, uint32 Buttons = 0, uint32 Duration = 0, const char *ButtonName0 = 0, const char *ButtonName1 = 0, uint32 SoundControls = 0); @@ -1021,48 +1021,241 @@ public: // Task System Methods void LoadClientTaskState(); void RemoveClientTaskState(); - void SendTaskActivityComplete(int TaskID, int ActivityID, int TaskIndex, TaskType type, int TaskIncomplete=1); - void SendTaskFailed(int TaskID, int TaskIndex, TaskType type); - void SendTaskComplete(int TaskIndex); - inline ClientTaskState *GetTaskState() const { return taskstate; } - - inline void CancelTask(int TaskIndex, TaskType type) { if(taskstate) taskstate->CancelTask(this, TaskIndex, type); } - inline bool SaveTaskState() { return (taskmanager ? taskmanager->SaveClientState(this, taskstate) : false); } - inline bool IsTaskStateLoaded() { return taskstate != nullptr; } - inline bool IsTaskActive(int TaskID) { return (taskstate ? taskstate->IsTaskActive(TaskID) : false); } - inline bool IsTaskActivityActive(int TaskID, int ActivityID) { return (taskstate ? taskstate->IsTaskActivityActive(TaskID, ActivityID) : false); } - inline ActivityState GetTaskActivityState(TaskType type, int index, int ActivityID) { return (taskstate ? taskstate->GetTaskActivityState(type, index, ActivityID) : ActivityHidden); } - inline void UpdateTaskActivity(int TaskID, int ActivityID, int Count, bool ignore_quest_update = false) { if (taskstate) taskstate->UpdateTaskActivity(this, TaskID, ActivityID, Count, ignore_quest_update); } - inline void RemoveTaskByTaskID(uint32 task_id) { if (taskstate) taskstate->RemoveTaskByTaskID(this, task_id); } - inline void ResetTaskActivity(int TaskID, int ActivityID) { if(taskstate) taskstate->ResetTaskActivity(this, TaskID, ActivityID); } - inline void UpdateTasksOnKill(int NPCTypeID) { if(taskstate) taskstate->UpdateTasksOnKill(this, NPCTypeID); } - inline void UpdateTasksForItem(ActivityType Type, int ItemID, int Count=1) { if(taskstate) taskstate->UpdateTasksForItem(this, Type, ItemID, Count); } - inline void UpdateTasksOnExplore(int ExploreID) { if(taskstate) taskstate->UpdateTasksOnExplore(this, ExploreID); } - inline bool UpdateTasksOnSpeakWith(int NPCTypeID) { if(taskstate) return taskstate->UpdateTasksOnSpeakWith(this, NPCTypeID); else return false; } - inline bool UpdateTasksOnDeliver(std::list& Items, int Cash, int NPCTypeID) { if (taskstate) return taskstate->UpdateTasksOnDeliver(this, Items, Cash, NPCTypeID); else return false; } - inline void TaskSetSelector(Mob *mob, int TaskSetID) { if(taskmanager) taskmanager->TaskSetSelector(this, taskstate, mob, TaskSetID); } - inline void TaskQuestSetSelector(Mob *mob, int count, int *tasks) { if(taskmanager) taskmanager->TaskQuestSetSelector(this, taskstate, mob, count, tasks); } - inline void EnableTask(int TaskCount, int *TaskList) { if(taskstate) taskstate->EnableTask(CharacterID(), TaskCount, TaskList); } - inline void DisableTask(int TaskCount, int *TaskList) { if(taskstate) taskstate->DisableTask(CharacterID(), TaskCount, TaskList); } - inline bool IsTaskEnabled(int TaskID) { return (taskstate ? taskstate->IsTaskEnabled(TaskID) : false); } - inline void ProcessTaskProximities(float X, float Y, float Z) { if(taskstate) taskstate->ProcessTaskProximities(this, X, Y, Z); } - inline void AssignTask(int TaskID, int NPCID, bool enforce_level_requirement = false) { if (taskstate) taskstate->AcceptNewTask(this, TaskID, NPCID, enforce_level_requirement); } - inline int ActiveSpeakTask(int NPCID) { if(taskstate) return taskstate->ActiveSpeakTask(NPCID); else return 0; } - inline int ActiveSpeakActivity(int NPCID, int TaskID) { if(taskstate) return taskstate->ActiveSpeakActivity(NPCID, TaskID); else return 0; } - inline void FailTask(int TaskID) { if(taskstate) taskstate->FailTask(this, TaskID); } - inline int TaskTimeLeft(int TaskID) { return (taskstate ? taskstate->TaskTimeLeft(TaskID) : 0); } - inline int EnabledTaskCount(int TaskSetID) { return (taskstate ? taskstate->EnabledTaskCount(TaskSetID) : -1); } - inline int IsTaskCompleted(int TaskID) { return (taskstate ? taskstate->IsTaskCompleted(TaskID) : -1); } - inline void ShowClientTasks() { if(taskstate) taskstate->ShowClientTasks(this); } - inline void CancelAllTasks() { if(taskstate) taskstate->CancelAllTasks(this); } - inline int GetActiveTaskCount() { return (taskstate ? taskstate->GetActiveTaskCount() : 0); } - inline int GetActiveTaskID(int index) { return (taskstate ? taskstate->GetActiveTaskID(index) : -1); } - inline int GetTaskStartTime(TaskType type, int index) { return (taskstate ? taskstate->GetTaskStartTime(type, index) : -1); } - inline bool IsTaskActivityCompleted(TaskType type, int index, int ActivityID) { return (taskstate ? taskstate->IsTaskActivityCompleted(type, index, ActivityID) : false); } - inline int GetTaskActivityDoneCount(TaskType type, int ClientTaskIndex, int ActivityID) { return (taskstate ? taskstate->GetTaskActivityDoneCount(type, ClientTaskIndex, ActivityID) :0); } - inline int GetTaskActivityDoneCountFromTaskID(int TaskID, int ActivityID) { return (taskstate ? taskstate->GetTaskActivityDoneCountFromTaskID(TaskID, ActivityID) :0); } - inline int ActiveTasksInSet(int TaskSet) { return (taskstate ? taskstate->ActiveTasksInSet(TaskSet) :0); } - inline int CompletedTasksInSet(int TaskSet) { return (taskstate ? taskstate->CompletedTasksInSet(TaskSet) :0); } + void SendTaskActivityComplete(int task_id, int activity_id, int task_index, TaskType task_type, int task_incomplete=1); + void SendTaskFailed(int task_id, int task_index, TaskType task_type); + void SendTaskComplete(int task_index); + inline ClientTaskState *GetTaskState() const { return task_state; } + inline void CancelTask(int TaskIndex, TaskType type) + { + if (task_state) { + task_state->CancelTask( + this, + TaskIndex, + type + ); + } + } + inline bool SaveTaskState() + { + return p_task_manager != nullptr && p_task_manager->SaveClientState(this, task_state); + } + inline bool IsTaskStateLoaded() { return task_state != nullptr; } + inline bool IsTaskActive(int TaskID) { return task_state != nullptr && task_state->IsTaskActive(TaskID); } + inline bool IsTaskActivityActive(int TaskID, int ActivityID) + { + return task_state != nullptr && + task_state->IsTaskActivityActive( + TaskID, + ActivityID + ); + } + inline ActivityState GetTaskActivityState(TaskType task_type, int index, int activity_id) + { + return (task_state ? task_state->GetTaskActivityState(task_type, index, activity_id) : ActivityHidden); + } + inline void UpdateTaskActivity( + int task_id, + int activity_id, + int count, + bool ignore_quest_update = false + ) + { + if (task_state) { + task_state->UpdateTaskActivity(this, task_id, activity_id, count, ignore_quest_update); + } + } + inline void RemoveTaskByTaskID(uint32 task_id) { + if (task_state) { + task_state->RemoveTaskByTaskID(this, task_id); + } + } + inline void ResetTaskActivity(int task_id, int activity_id) + { + if (task_state) { + task_state->ResetTaskActivity( + this, + task_id, + activity_id + ); + } + } + inline void UpdateTasksOnKill(int npc_type_id) + { + if (task_state) { + task_state->UpdateTasksOnKill( + this, + npc_type_id + ); + } + } + inline void UpdateTasksForItem( + ActivityType activity_type, + int item_id, + int count = 1 + ) + { + if (task_state) { + task_state->UpdateTasksForItem(this, activity_type, item_id, count); + } + } + inline void UpdateTasksOnExplore(int explore_id) + { + if (task_state) { + task_state->UpdateTasksOnExplore( + this, + explore_id + ); + } + } + inline bool UpdateTasksOnSpeakWith(int npc_type_id) + { + if (task_state) { + return task_state->UpdateTasksOnSpeakWith( + this, + npc_type_id + ); + } + else { return false; } + } + inline bool UpdateTasksOnDeliver( + std::list &items, + int cash, + int npc_type_id + ) + { + if (task_state) { + return task_state->UpdateTasksOnDeliver( + this, + items, + cash, + npc_type_id + ); + } + else { return false; } + } + inline void TaskSetSelector(Mob *mob, int task_set_id) + { + if (p_task_manager) { + p_task_manager->TaskSetSelector( + this, + task_state, + mob, + task_set_id + ); + } + } + inline void TaskQuestSetSelector(Mob *mob, int count, int *tasks) + { + if (p_task_manager) { + p_task_manager->TaskQuestSetSelector( + this, + task_state, + mob, + count, + tasks + ); + } + } + inline void EnableTask(int task_count, int *task_list) + { + if (task_state) { + task_state->EnableTask( + CharacterID(), + task_count, + task_list + ); + } + } + inline void DisableTask(int task_count, int *task_list) + { + if (task_state) { + task_state->DisableTask( + CharacterID(), + task_count, + task_list + ); + } + } + inline bool IsTaskEnabled(int task_id) { + return task_state != nullptr && task_state->IsTaskEnabled(task_id); + } + inline void ProcessTaskProximities(float X, float Y, float Z) + { + if (task_state) { + task_state->ProcessTaskProximities( + this, + X, + Y, + Z + ); + } + } + inline void AssignTask( + int task_id, + int npc_id, + bool enforce_level_requirement = false + ) { + if (task_state) { + task_state->AcceptNewTask(this, task_id, npc_id, enforce_level_requirement); + } + } + inline int ActiveSpeakTask(int npc_type_id) + { + if (task_state) { + return task_state->ActiveSpeakTask(npc_type_id); + } + else { + return 0; + } + } + inline int ActiveSpeakActivity(int npc_type_id, int task_id) + { + if (task_state) { + return task_state->ActiveSpeakActivity( + npc_type_id, + task_id + ); + } + else { return 0; } + } + 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) + { + return (task_state ? task_state->EnabledTaskCount(task_set_id) : -1); + } + inline int IsTaskCompleted(int task_id) { return (task_state ? task_state->IsTaskCompleted(task_id) : -1); } + inline void ShowClientTasks() { if (task_state) { task_state->ShowClientTasks(this); }} + inline void CancelAllTasks() { if (task_state) { task_state->CancelAllTasks(this); }} + inline int GetActiveTaskCount() { return (task_state ? task_state->GetActiveTaskCount() : 0); } + inline int GetActiveTaskID(int index) { return (task_state ? task_state->GetActiveTaskID(index) : -1); } + inline int GetTaskStartTime(TaskType task_type, int index) + { + return (task_state ? task_state->GetTaskStartTime( + task_type, + index + ) : -1); + } + inline bool IsTaskActivityCompleted(TaskType task_type, int index, int activity_id) + { + return task_state != nullptr && task_state->IsTaskActivityCompleted(task_type, index, activity_id); + } + inline int GetTaskActivityDoneCount(TaskType task_type, int client_task_index, int activity_id) + { + return (task_state ? task_state->GetTaskActivityDoneCount(task_type, client_task_index, activity_id) : 0); + } + inline int GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id) + { + return (task_state ? task_state->GetTaskActivityDoneCountFromTaskID(task_id, activity_id) : 0); + } + inline int ActiveTasksInSet(int task_set_id) + { + return (task_state ? task_state->ActiveTasksInSet(task_set_id) : 0); + } + inline int CompletedTasksInSet(int task_set_id) + { + return (task_state ? task_state->CompletedTasksInSet(task_set_id) : 0); + } inline const EQ::versions::ClientVersion ClientVersion() const { return m_ClientVersion; } inline const uint32 ClientVersionBit() const { return m_ClientVersionBit; } @@ -1645,7 +1838,7 @@ private: std::set zone_flags; - ClientTaskState *taskstate; + ClientTaskState *task_state; int TotalSecondsPlayed; //Anti Spam Stuff diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 12df5cb0e..8ce8057a5 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1821,8 +1821,8 @@ void Client::Handle_OP_AcceptNewTask(const EQApplicationPacket *app) } AcceptNewTask_Struct *ant = (AcceptNewTask_Struct*)app->pBuffer; - if (ant->task_id > 0 && RuleB(TaskSystem, EnableTaskSystem) && taskstate) - taskstate->AcceptNewTask(this, ant->task_id, ant->task_master_id); + if (ant->task_id > 0 && RuleB(TaskSystem, EnableTaskSystem) && task_state) + task_state->AcceptNewTask(this, ant->task_id, ant->task_master_id); } void Client::Handle_OP_AdventureInfoRequest(const EQApplicationPacket *app) @@ -4004,8 +4004,8 @@ void Client::Handle_OP_CancelTask(const EQApplicationPacket *app) } CancelTask_Struct *cts = (CancelTask_Struct*)app->pBuffer; - if (RuleB(TaskSystem, EnableTaskSystem) && taskstate) - taskstate->CancelTask(this, cts->SequenceNumber, static_cast(cts->type)); + if (RuleB(TaskSystem, EnableTaskSystem) && task_state) + task_state->CancelTask(this, cts->SequenceNumber, static_cast(cts->type)); } void Client::Handle_OP_CancelTrade(const EQApplicationPacket *app) @@ -13996,8 +13996,8 @@ void Client::Handle_OP_TaskHistoryRequest(const EQApplicationPacket *app) } TaskHistoryRequest_Struct *ths = (TaskHistoryRequest_Struct*)app->pBuffer; - if (RuleB(TaskSystem, EnableTaskSystem) && taskstate) - taskstate->SendTaskHistory(this, ths->TaskIndex); + if (RuleB(TaskSystem, EnableTaskSystem) && task_state) + task_state->SendTaskHistory(this, ths->TaskIndex); } void Client::Handle_OP_Taunt(const EQApplicationPacket *app) diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 15dfa160f..fd8a6cb02 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -158,8 +158,8 @@ bool Client::Process() { CalcItemScale(); } - if (TaskPeriodic_Timer.Check() && taskstate) - taskstate->TaskPeriodicChecks(this); + if (TaskPeriodic_Timer.Check() && task_state) + task_state->TaskPeriodicChecks(this); if (dynamiczone_removal_timer.Check() && zone && zone->GetInstanceID() != 0) { diff --git a/zone/command.cpp b/zone/command.cpp index c156d4331..9fb970f9b 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -77,7 +77,7 @@ extern QueryServ* QServ; extern WorldServer worldserver; -extern TaskManager *taskmanager; +extern TaskManager *p_task_manager; extern FastMath g_Math; void CatchSignal(int sig_num); diff --git a/zone/entity.cpp b/zone/entity.cpp index f48b371ce..98c4dc2e5 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -3900,7 +3900,7 @@ void EntityList::ProcessProximitySay(const char *Message, Client *c, uint8 langu void EntityList::SaveAllClientsTaskState() { - if (!taskmanager) + if (!p_task_manager) return; auto it = client_list.begin(); @@ -3915,7 +3915,7 @@ void EntityList::SaveAllClientsTaskState() void EntityList::ReloadAllClientsTaskState(int TaskID) { - if (!taskmanager) + if (!p_task_manager) return; auto it = client_list.begin(); @@ -3928,7 +3928,7 @@ void EntityList::ReloadAllClientsTaskState(int TaskID) Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] Reloading Task State For Client %s", client->GetName()); client->RemoveClientTaskState(); client->LoadClientTaskState(); - taskmanager->SendActiveTasksToClient(client); + p_task_manager->SendActiveTasksToClient(client); } } ++it; diff --git a/zone/main.cpp b/zone/main.cpp index 7b5fca736..a89f25f9e 100644 --- a/zone/main.cpp +++ b/zone/main.cpp @@ -115,8 +115,8 @@ char errorname[32]; extern Zone* zone; npcDecayTimes_Struct npcCorpseDecayTimes[100]; TitleManager title_manager; -QueryServ *QServ = 0; -TaskManager *taskmanager = 0; +QueryServ *QServ = 0; +TaskManager *p_task_manager = 0; NpcScaleManager *npc_scale_manager; QuestParserCollection *parse = 0; EQEmuLogSys LogSys; @@ -427,8 +427,8 @@ int main(int argc, char** argv) { if (RuleB(TaskSystem, EnableTaskSystem)) { Log(Logs::General, Logs::Tasks, "[INIT] Loading Tasks"); - taskmanager = new TaskManager; - taskmanager->LoadTasks(); + p_task_manager = new TaskManager; + p_task_manager->LoadTasks(); } parse = new QuestParserCollection(); @@ -607,7 +607,7 @@ int main(int argc, char** argv) { if (zone != 0) Zone::Shutdown(true); //Fix for Linux world server problem. - safe_delete(taskmanager); + safe_delete(p_task_manager); command_deinit(); #ifdef BOTS bot_command_deinit(); diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index f164341f8..247aa9501 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -2223,27 +2223,27 @@ bool QuestManager::createBot(const char *name, const char *lastname, uint8 level void QuestManager::taskselector(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && taskmanager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && p_task_manager) initiator->TaskQuestSetSelector(owner, taskcount, tasks); } void QuestManager::enabletask(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && taskmanager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && p_task_manager) initiator->EnableTask(taskcount, tasks); } void QuestManager::disabletask(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && taskmanager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && p_task_manager) initiator->DisableTask(taskcount, tasks); } bool QuestManager::istaskenabled(int taskid) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && taskmanager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && p_task_manager) return initiator->IsTaskEnabled(taskid); return false; @@ -2252,7 +2252,7 @@ bool QuestManager::istaskenabled(int taskid) { void QuestManager::tasksetselector(int tasksetid) { QuestManagerCurrentQuestVars(); Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSetSelector called for task set %i", tasksetid); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && taskmanager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && p_task_manager) initiator->TaskSetSelector(owner, tasksetid); } @@ -2341,8 +2341,8 @@ int QuestManager::enabledtaskcount(int taskset) { int QuestManager::firsttaskinset(int taskset) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && taskmanager) - return taskmanager->FirstTaskInSet(taskset); + if(RuleB(TaskSystem, EnableTaskSystem) && p_task_manager) + return p_task_manager->FirstTaskInSet(taskset); return -1; } @@ -2350,8 +2350,8 @@ int QuestManager::firsttaskinset(int taskset) { int QuestManager::lasttaskinset(int taskset) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && taskmanager) - return taskmanager->LastTaskInSet(taskset); + if(RuleB(TaskSystem, EnableTaskSystem) && p_task_manager) + return p_task_manager->LastTaskInSet(taskset); return -1; } @@ -2359,8 +2359,8 @@ int QuestManager::lasttaskinset(int taskset) { int QuestManager::nexttaskinset(int taskset, int taskid) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && taskmanager) - return taskmanager->NextTaskInSet(taskset, taskid); + if(RuleB(TaskSystem, EnableTaskSystem) && p_task_manager) + return p_task_manager->NextTaskInSet(taskset, taskid); return -1; } @@ -2412,8 +2412,8 @@ int QuestManager::completedtasksinset(int taskset) { bool QuestManager::istaskappropriate(int task) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && taskmanager) - return taskmanager->AppropriateLevel(task, initiator->GetLevel()); + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && p_task_manager) + return p_task_manager->ValidateLevel(task, initiator->GetLevel()); return false; } @@ -2422,7 +2422,7 @@ std::string QuestManager::gettaskname(uint32 task_id) { QuestManagerCurrentQuestVars(); if (RuleB(TaskSystem, EnableTaskSystem)) { - return taskmanager->GetTaskName(task_id); + return p_task_manager->GetTaskName(task_id); } return std::string(); diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 3b8011829..866c5fb2f 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -40,18 +40,21 @@ Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net) #include "queryserv.h" #include "quest_parser_collection.h" +#include "../common/repositories/completed_tasks_repository.h" -extern QueryServ* QServ; +extern QueryServ *QServ; -TaskManager::TaskManager() { - for(int i=0; i= MAXTASKS)) return false; + if ((TaskID <= 0) || (TaskID >= MAXTASKS)) { return false; } // If this task already exists in memory, free all the dynamically allocated strings. - if(Tasks[TaskID]) { + if (Tasks[TaskID]) { safe_delete(Tasks[TaskID]); } return LoadTasks(TaskID); } -void TaskManager::ReloadGoalLists() { +void TaskManager::ReloadGoalLists() +{ - if(!GoalListManager.LoadLists()) - Log(Logs::Detail, Logs::Tasks,"TaskManager::LoadTasks LoadLists failed"); + if (!GoalListManager.LoadLists()) + Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadLists failed"); } bool TaskManager::LoadTasks(int singleTask) { - // If TaskID !=0, then just load the task specified. + // If task_id !=0, then just load the task specified. Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskManager::LoadTasks Called"); std::string query; @@ -121,15 +126,21 @@ bool TaskManager::LoadTasks(int singleTask) if (!LoadTaskSets()) Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadTaskSets failed"); - query = StringFormat("SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " - "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," - "`minlevel`, `maxlevel`, `repeatable`, `completion_emote` FROM `tasks` WHERE `id` < %i", - MAXTASKS); - } else - query = StringFormat("SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " - "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," - "`minlevel`, `maxlevel`, `repeatable`, `completion_emote` FROM `tasks` WHERE `id` = %i", - singleTask); + query = StringFormat( + "SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " + "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," + "`minlevel`, `maxlevel`, `repeatable`, `completion_emote` FROM `tasks` WHERE `id` < %i", + MAXTASKS + ); + } + else { + query = StringFormat( + "SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " + "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," + "`minlevel`, `maxlevel`, `repeatable`, `completion_emote` FROM `tasks` WHERE `id` = %i", + singleTask + ); + } const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::LoadTasks: %s"; @@ -149,47 +160,53 @@ bool TaskManager::LoadTasks(int singleTask) } Tasks[taskID] = new TaskInformation; - Tasks[taskID]->type = static_cast(atoi(row[1])); - Tasks[taskID]->Duration = atoi(row[2]); - Tasks[taskID]->dur_code = static_cast(atoi(row[3])); - Tasks[taskID]->Title = row[4]; - Tasks[taskID]->Description = row[5]; - Tasks[taskID]->Reward = row[6]; - Tasks[taskID]->RewardID = atoi(row[7]); - Tasks[taskID]->CashReward = atoi(row[8]); - Tasks[taskID]->XPReward = atoi(row[9]); - Tasks[taskID]->RewardMethod = (TaskMethodType)atoi(row[10]); - Tasks[taskID]->faction_reward = atoi(row[11]); - Tasks[taskID]->MinLevel = atoi(row[12]); - Tasks[taskID]->MaxLevel = atoi(row[13]); - Tasks[taskID]->Repeatable = atoi(row[14]); - Tasks[taskID]->completion_emote = row[15]; - Tasks[taskID]->ActivityCount = 0; - Tasks[taskID]->SequenceMode = ActivitiesSequential; - Tasks[taskID]->LastStep = 0; + Tasks[taskID]->type = static_cast(atoi(row[1])); + Tasks[taskID]->duration = atoi(row[2]); + Tasks[taskID]->duration_code = static_cast(atoi(row[3])); + Tasks[taskID]->title = row[4]; + Tasks[taskID]->description = row[5]; + Tasks[taskID]->reward = row[6]; + Tasks[taskID]->reward_id = atoi(row[7]); + Tasks[taskID]->cash_reward = atoi(row[8]); + Tasks[taskID]->experience_reward = atoi(row[9]); + Tasks[taskID]->reward_method = (TaskMethodType) atoi(row[10]); + Tasks[taskID]->faction_reward = atoi(row[11]); + Tasks[taskID]->min_level = atoi(row[12]); + Tasks[taskID]->max_level = atoi(row[13]); + Tasks[taskID]->repeatable = atoi(row[14]); + Tasks[taskID]->completion_emote = row[15]; + Tasks[taskID]->activity_count = 0; + Tasks[taskID]->sequence_mode = ActivitiesSequential; + Tasks[taskID]->last_step = 0; Log(Logs::General, Logs::Tasks, - "[GLOBALLOAD] TaskID: %5i, Duration: %8i, Reward: %s MinLevel %i MaxLevel %i " - "Repeatable: %s", - taskID, Tasks[taskID]->Duration, Tasks[taskID]->Reward.c_str(), - Tasks[taskID]->MinLevel, Tasks[taskID]->MaxLevel, Tasks[taskID]->Repeatable ? "Yes" : "No"); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Title: %s", Tasks[taskID]->Title.c_str()); + "[GLOBALLOAD] task_id: %5i, duration: %8i, reward: %s min_level %i max_level %i " + "repeatable: %s", + taskID, Tasks[taskID]->duration, Tasks[taskID]->reward.c_str(), + Tasks[taskID]->min_level, Tasks[taskID]->max_level, Tasks[taskID]->repeatable ? "Yes" : "No"); + Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] title: %s", Tasks[taskID]->title.c_str()); } - if (singleTask == 0) + if (singleTask == 0) { query = - StringFormat("SELECT `taskid`, `step`, `activityid`, `activitytype`, `target_name`, `item_list`, " - "`skill_list`, `spell_list`, `description_override`, `goalid`, `goalmethod`, " - "`goalcount`, `delivertonpc`, `zones`, `optional` FROM `task_activities` WHERE `taskid` < " - "%i AND `activityid` < %i ORDER BY taskid, activityid ASC", - MAXTASKS, MAXACTIVITIESPERTASK); - else + StringFormat( + "SELECT `taskid`, `step`, `activityid`, `activitytype`, `target_name`, `item_list`, " + "`skill_list`, `spell_list`, `description_override`, `goalid`, `goalmethod`, " + "`goalcount`, `delivertonpc`, `zones`, `optional` FROM `task_activities` WHERE `taskid` < " + "%i AND `activityid` < %i ORDER BY taskid, activityid ASC", + MAXTASKS, MAXACTIVITIESPERTASK + ); + } + else { query = - StringFormat("SELECT `taskid`, `step`, `activityid`, `activitytype`, `target_name`, `item_list`, " - "`skill_list`, `spell_list`, `description_override`, `goalid`, `goalmethod`, " - "`goalcount`, `delivertonpc`, `zones`, `optional` FROM `task_activities` WHERE `taskid` = " - "%i AND `activityid` < %i ORDER BY taskid, activityid ASC", - singleTask, MAXACTIVITIESPERTASK); + StringFormat( + "SELECT `taskid`, `step`, `activityid`, `activitytype`, `target_name`, `item_list`, " + "`skill_list`, `spell_list`, `description_override`, `goalid`, `goalmethod`, " + "`goalcount`, `delivertonpc`, `zones`, `optional` FROM `task_activities` WHERE `taskid` = " + "%i AND `activityid` < %i ORDER BY taskid, activityid ASC", + singleTask, MAXACTIVITIESPERTASK + ); + } results = content_db.QueryDatabase(query); if (!results.Success()) { LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); @@ -198,83 +215,87 @@ bool TaskManager::LoadTasks(int singleTask) for (auto row = results.begin(); row != results.end(); ++row) { int taskID = atoi(row[0]); - int step = atoi(row[1]); + int step = atoi(row[1]); int activityID = atoi(row[2]); if ((taskID <= 0) || (taskID >= MAXTASKS) || (activityID < 0) || (activityID >= MAXACTIVITIESPERTASK)) { // This shouldn't happen, as the SELECT is bounded by MAXTASKS - LogError("[TASKS]Task or Activity ID ([{}], [{}]) out of range while loading activities from database", taskID, activityID); + LogError("[TASKS]Task or activity_information ID ([{}], [{}]) out of range while loading activities from database", + taskID, + activityID); continue; } if (Tasks[taskID] == nullptr) { - LogError("[TASKS]Activity for non-existent task ([{}], [{}]) while loading activities from database", - taskID, activityID); + LogError("[TASKS]activity_information for non-existent task ([{}], [{}]) while loading activities from database", + taskID, activityID); continue; } - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].StepNumber = step; + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].StepNumber = step; - if (step != 0) - Tasks[taskID]->SequenceMode = ActivitiesStepped; + if (step != 0) { + Tasks[taskID]->sequence_mode = ActivitiesStepped; + } - if (step > Tasks[taskID]->LastStep) - Tasks[taskID]->LastStep = step; + if (step > Tasks[taskID]->last_step) { + Tasks[taskID]->last_step = step; + } // Task Activities MUST be numbered sequentially from 0. If not, log an error // and set the task to nullptr. Subsequent activities for this task will raise // ERR_NOTASK errors. - // Change to (activityID != (Tasks[taskID]->ActivityCount + 1)) to index from 1 - if (activityID != Tasks[taskID]->ActivityCount) { + // Change to (activityID != (Tasks[taskID]->activity_count + 1)) to index from 1 + if (activityID != Tasks[taskID]->activity_count) { LogError("[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", taskID, - activityID); + activityID); Tasks[taskID] = nullptr; continue; } - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].Type = atoi(row[3]); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].Type = atoi(row[3]); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].target_name = row[4]; - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].item_list = row[5]; - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].skill_list = row[6]; - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].skill_id = atoi(row[6]); // for older clients - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].spell_list = row[7]; - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].spell_id = atoi(row[7]); // for older clients - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].desc_override = row[8]; + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].target_name = row[4]; + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].item_list = row[5]; + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].skill_list = row[6]; + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].skill_id = atoi(row[6]); // for older clients + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].spell_list = row[7]; + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].spell_id = atoi(row[7]); // for older clients + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].desc_override = row[8]; - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalID = atoi(row[9]); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalMethod = (TaskMethodType)atoi(row[10]); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalCount = atoi(row[11]); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].DeliverToNPC = atoi(row[12]); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].zones = row[13]; - auto zones = SplitString(Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].zones, ';'); - for (auto && e : zones) - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].ZoneIDs.push_back(std::stoi(e)); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].Optional = atoi(row[14]); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalID = atoi(row[9]); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalMethod = (TaskMethodType) atoi(row[10]); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalCount = atoi(row[11]); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].DeliverToNPC = atoi(row[12]); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].zones = row[13]; + auto zones = SplitString(Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].zones, ';'); + for (auto &&e : zones) + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].ZoneIDs.push_back(std::stoi(e)); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].Optional = atoi(row[14]); Log(Logs::General, Logs::Tasks, - "[GLOBALLOAD] Activity Slot %2i: ID %i for Task %5i. Type: %3i, GoalID: %8i, " - "GoalMethod: %i, GoalCount: %3i, Zones:%s", - Tasks[taskID]->ActivityCount, activityID, taskID, - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].Type, - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalID, - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalMethod, - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalCount, - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].zones.c_str()); + "[GLOBALLOAD] activity_information Slot %2i: ID %i for Task %5i. Type: %3i, GoalID: %8i, " + "GoalMethod: %i, GoalCount: %3i, Zones:%s", + Tasks[taskID]->activity_count, activityID, taskID, + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].Type, + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalID, + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalMethod, + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalCount, + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].zones.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] target_name: %s", - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].target_name.c_str()); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].target_name.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] item_list: %s", - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].item_list.c_str()); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].item_list.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] skill_list: %s", - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].skill_list.c_str()); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].skill_list.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] spell_list: %s", - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].spell_list.c_str()); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].spell_list.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] description_override: %s", - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].desc_override.c_str()); + Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].desc_override.c_str()); - Tasks[taskID]->ActivityCount++; + Tasks[taskID]->activity_count++; } return true; @@ -286,8 +307,9 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) // doesn't seem to like tasks moving slots between zoning and you can end up with 'bogus' activities if the task // previously in that slot had more activities than the one now occupying it. Hopefully retaining the slot // number for the duration of a session will overcome this. - if (!c || !state) + if (!c || !state) { return false; + } const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::SaveClientState %s"; @@ -295,67 +317,78 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) Log(Logs::Detail, Logs::Tasks, "TaskManager::SaveClientState for character ID %d", characterID); - if (state->ActiveTaskCount > 0 || state->ActiveTask.TaskID != TASKSLOTEMPTY) { // TODO: tasks - for (int task = 0; task < MAXACTIVEQUESTS + 1; task++) { - int taskID = state->ActiveTasks[task].TaskID; - if (taskID == TASKSLOTEMPTY) + if (state->active_task_count > 0 || state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks + for (auto & ActiveTask : state->ActiveTasks) { + int taskID = ActiveTask.task_id; + if (taskID == TASKSLOTEMPTY) { continue; + } - int slot = state->ActiveTasks[task].slot; + int slot = ActiveTask.slot; - if (state->ActiveTasks[task].Updated) { + if (ActiveTask.updated) { Log(Logs::General, Logs::Tasks, - "[CLIENTSAVE] TaskManager::SaveClientState for character ID %d, Updating TaskIndex " - "%i TaskID %i", - characterID, slot, taskID); + "[CLIENTSAVE] TaskManager::SaveClientState for character ID %d, Updating TaskIndex " + "%i task_id %i", + characterID, slot, taskID); - std::string query = StringFormat( - "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime) " - "VALUES (%i, %i, %i, %i, %i)", - characterID, taskID, slot, static_cast(Tasks[taskID]->type), - state->ActiveTasks[task].AcceptedTime); - auto results = database.QueryDatabase(query); + std::string query = StringFormat( + "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime) " + "VALUES (%i, %i, %i, %i, %i)", + characterID, taskID, slot, static_cast(Tasks[taskID]->type), + ActiveTask.accepted_time + ); + auto results = database.QueryDatabase(query); if (!results.Success()) { LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - } else { - state->ActiveTasks[task].Updated = false; + } + else { + ActiveTask.updated = false; } } std::string query = - "REPLACE INTO character_activities (charid, taskid, activityid, donecount, completed) " - "VALUES "; + "REPLACE INTO character_activities (charid, taskid, activityid, donecount, completed) " + "VALUES "; - int updatedActivityCount = 0; - for (int activityIndex = 0; activityIndex < Tasks[taskID]->ActivityCount; ++activityIndex) { + int updatedActivityCount = 0; + for (int activityIndex = 0; activityIndex < Tasks[taskID]->activity_count; ++activityIndex) { - if (!state->ActiveTasks[task].Activity[activityIndex].Updated) + if (!ActiveTask.activity[activityIndex].updated) { continue; + } Log(Logs::General, Logs::Tasks, - "[CLIENTSAVE] TaskManager::SaveClientSate for character ID %d, Updating Activity " - "%i, %i", - characterID, slot, activityIndex); + "[CLIENTSAVE] TaskManager::SaveClientSate for character ID %d, Updating activity_information " + "%i, %i", + characterID, slot, activityIndex); - if (updatedActivityCount == 0) + if (updatedActivityCount == 0) { query += - StringFormat("(%i, %i, %i, %i, %i)", characterID, taskID, activityIndex, - state->ActiveTasks[task].Activity[activityIndex].DoneCount, - state->ActiveTasks[task].Activity[activityIndex].State == - ActivityCompleted); - else + StringFormat( + "(%i, %i, %i, %i, %i)", characterID, taskID, activityIndex, + ActiveTask.activity[activityIndex].done_count, + ActiveTask.activity[activityIndex].activity_state == + ActivityCompleted + ); + } + else { query += - StringFormat(", (%i, %i, %i, %i, %i)", characterID, taskID, activityIndex, - state->ActiveTasks[task].Activity[activityIndex].DoneCount, - state->ActiveTasks[task].Activity[activityIndex].State == - ActivityCompleted); + StringFormat( + ", (%i, %i, %i, %i, %i)", characterID, taskID, activityIndex, + ActiveTask.activity[activityIndex].done_count, + ActiveTask.activity[activityIndex].activity_state == + ActivityCompleted + ); + } updatedActivityCount++; } - if (updatedActivityCount == 0) + if (updatedActivityCount == 0) { continue; + } Log(Logs::General, Logs::Tasks, "[CLIENTSAVE] Executing query %s", query.c_str()); auto results = database.QueryDatabase(query); @@ -365,119 +398,134 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) continue; } - state->ActiveTasks[task].Updated = false; - for (int activityIndex = 0; activityIndex < Tasks[taskID]->ActivityCount; ++activityIndex) - state->ActiveTasks[task].Activity[activityIndex].Updated = false; + ActiveTask.updated = false; + for (int activityIndex = 0; + activityIndex < Tasks[taskID]->activity_count; + ++activityIndex) + ActiveTask.activity[activityIndex].updated = false; } } if (!RuleB(TaskSystem, RecordCompletedTasks) || - (state->CompletedTasks.size() <= (unsigned int)state->LastCompletedTaskLoaded)) { - state->LastCompletedTaskLoaded = state->CompletedTasks.size(); + (state->completed_tasks.size() <= (unsigned int) state->last_completed_task_loaded)) { + state->last_completed_task_loaded = state->completed_tasks.size(); return true; } const char *completedTaskQuery = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " - "VALUES (%i, %i, %i, %i)"; + "VALUES (%i, %i, %i, %i)"; - for (unsigned int i = state->LastCompletedTaskLoaded; i < state->CompletedTasks.size(); i++) { + for (unsigned int i = state->last_completed_task_loaded; i < state->completed_tasks.size(); i++) { Log(Logs::General, Logs::Tasks, - "[CLIENTSAVE] TaskManager::SaveClientState Saving Completed Task at slot %i", i); - int taskID = state->CompletedTasks[i].TaskID; + "[CLIENTSAVE] TaskManager::SaveClientState Saving Completed Task at slot %i", i); + int taskID = state->completed_tasks[i].task_id; - if ((taskID <= 0) || (taskID >= MAXTASKS) || (Tasks[taskID] == nullptr)) + if ((taskID <= 0) || (taskID >= MAXTASKS) || (Tasks[taskID] == nullptr)) { continue; + } - // First we save a record with an ActivityID of -1. + // First we save a record with an activity_id of -1. // This indicates this task was completed at the given time. We infer that all // none optional activities were completed. // - std::string query = - StringFormat(completedTaskQuery, characterID, state->CompletedTasks[i].CompletedTime, taskID, -1); - auto results = database.QueryDatabase(query); + std::string query = + StringFormat( + completedTaskQuery, + characterID, + state->completed_tasks[i].completed_time, + taskID, + -1 + ); + auto results = database.QueryDatabase(query); if (!results.Success()) { LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); continue; } // If the Rule to record non-optional task completion is not enabled, don't save it - if (!RuleB(TaskSystem, RecordCompletedOptionalActivities)) + if (!RuleB(TaskSystem, RecordCompletedOptionalActivities)) { continue; + } // Insert one record for each completed optional task. - for (int j = 0; j < Tasks[taskID]->ActivityCount; j++) { - if (!Tasks[taskID]->Activity[j].Optional || !state->CompletedTasks[i].ActivityDone[j]) + for (int j = 0; j < Tasks[taskID]->activity_count; j++) { + if (!Tasks[taskID]->activity_information[j].Optional || !state->completed_tasks[i].activity_done[j]) { continue; + } - query = StringFormat(completedTaskQuery, characterID, state->CompletedTasks[i].CompletedTime, - taskID, j); + query = StringFormat( + completedTaskQuery, characterID, state->completed_tasks[i].completed_time, + taskID, j + ); results = database.QueryDatabase(query); if (!results.Success()) LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); } } - state->LastCompletedTaskLoaded = state->CompletedTasks.size(); + state->last_completed_task_loaded = state->completed_tasks.size(); return true; } -void Client::LoadClientTaskState() { +void Client::LoadClientTaskState() +{ + if (RuleB(TaskSystem, EnableTaskSystem) && p_task_manager) { + if (task_state) { + safe_delete(task_state); + } - if(RuleB(TaskSystem, EnableTaskSystem) && taskmanager) { - if(taskstate) - safe_delete(taskstate); - - taskstate = new ClientTaskState; - if(!taskmanager->LoadClientState(this, taskstate)) { - safe_delete(taskstate); + task_state = new ClientTaskState; + if (!p_task_manager->LoadClientState(this, task_state)) { + safe_delete(task_state); } else { - taskmanager->SendActiveTasksToClient(this); - taskmanager->SendCompletedTasksToClient(this, taskstate); + p_task_manager->SendActiveTasksToClient(this); + p_task_manager->SendCompletedTasksToClient(this, task_state); } } - } -void Client::RemoveClientTaskState() { - - if(taskstate) { - taskstate->CancelAllTasks(this); - safe_delete(taskstate); +void Client::RemoveClientTaskState() +{ + if (task_state) { + task_state->CancelAllTasks(this); + safe_delete(task_state); } } bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) { - if (!c || !state) + if (!c || !state) { return false; + } - int characterID = c->CharacterID(); + int character_id = c->CharacterID(); - state->ActiveTaskCount = 0; + state->active_task_count = 0; - Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] TaskManager::LoadClientState for character ID %d", characterID); + LogTasks("[LoadClientState] for character_id [{}]", character_id); + + std::string query = StringFormat( + "SELECT `taskid`, `slot`,`type`, `acceptedtime` " + "FROM `character_tasks` " + "WHERE `charid` = %i ORDER BY acceptedtime", + character_id + ); - std::string query = StringFormat("SELECT `taskid`, `slot`,`type`, `acceptedtime` " - "FROM `character_tasks` " - "WHERE `charid` = %i ORDER BY acceptedtime", - characterID); auto results = database.QueryDatabase(query); if (!results.Success()) { - LogError("[TASKS]Error in TaskManager::LoadClientState load Tasks: [{}]", - results.ErrorMessage().c_str()); return false; } for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - int slot = atoi(row[1]); - TaskType type = static_cast(atoi(row[2])); + int task_id = atoi(row[0]); + int slot = atoi(row[1]); + auto type = static_cast(atoi(row[2])); - if ((taskID < 0) || (taskID >= MAXTASKS)) { - LogError("[TASKS]Task ID [{}] out of range while loading character tasks from database", taskID); + if ((task_id < 0) || (task_id >= MAXTASKS)) { + LogError("[TASKS]Task ID [{}] out of range while loading character tasks from database", task_id); continue; } @@ -488,317 +536,358 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) continue; } - if (task_info->TaskID != TASKSLOTEMPTY) { - LogError("[TASKS] Slot [{}] for Task [{}]s is already occupied", slot, - taskID); + if (task_info->task_id != TASKSLOTEMPTY) { + LogError("[TASKS] Slot [{}] for Task [{}]s is already occupied", slot, task_id); continue; } - int acceptedtime = atoi(row[3]); + int accepted_time = atoi(row[3]); - task_info->TaskID = taskID; - task_info->CurrentStep = -1; - task_info->AcceptedTime = acceptedtime; - task_info->Updated = false; + task_info->task_id = task_id; + task_info->current_step = -1; + task_info->accepted_time = accepted_time; + task_info->updated = false; - for (int i = 0; i < MAXACTIVITIESPERTASK; i++) - task_info->Activity[i].ActivityID = -1; + for (auto & i : task_info->activity) { + i.activity_id = -1; + } - if (type == TaskType::Quest) - ++state->ActiveTaskCount; + if (type == TaskType::Quest) { + ++state->active_task_count; + } - Log(Logs::General, Logs::Tasks, - "[CLIENTLOAD] TaskManager::LoadClientState. Char: %i Task ID %i, Accepted Time: %8X", characterID, - taskID, acceptedtime); + LogTasks("[LoadClientState] character_id [{}] task_id [{}] accepted_time [{}]", character_id, task_id, accepted_time); } // Load Activities - Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] LoadClientState. Loading activities for character ID %d", - characterID); + LogTasks("[LoadClientState] Loading activities for character_id [{}]", character_id); - query = StringFormat("SELECT `taskid`, `activityid`, `donecount`, `completed` " - "FROM `character_activities` " - "WHERE `charid` = %i " - "ORDER BY `taskid` ASC, `activityid` ASC", - characterID); + query = StringFormat( + "SELECT `taskid`, `activityid`, `donecount`, `completed` " + "FROM `character_activities` " + "WHERE `charid` = %i " + "ORDER BY `taskid` ASC, `activityid` ASC", + character_id + ); results = database.QueryDatabase(query); if (!results.Success()) { - LogError("[TASKS]Error in TaskManager::LoadClientState load Activities: [{}]", - results.ErrorMessage().c_str()); return false; } for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - if ((taskID < 0) || (taskID >= MAXTASKS)) { - LogError("[TASKS]Task ID [{}] out of range while loading character activities from database", taskID); + int task_id = atoi(row[0]); + if ((task_id < 0) || (task_id >= MAXTASKS)) { + LogTasks( + "[LoadClientState] Error: task_id [{}] out of range while loading character activities from database character_id [{}]", + task_id, + character_id + ); continue; } - int activityID = atoi(row[1]); - if ((activityID < 0) || (activityID >= MAXACTIVITIESPERTASK)) { - LogError("[TASKS]Activity ID [{}] out of range while loading character activities from database", - activityID); + int activity_id = atoi(row[1]); + if ((activity_id < 0) || (activity_id >= MAXACTIVITIESPERTASK)) { + LogTasks( + "[LoadClientState] Error: activity_id [{}] out of range while loading character activities from database character_id [{}]", + activity_id, + character_id + ); + continue; } ClientTaskInformation *task_info = nullptr; - - if (state->ActiveTask.TaskID == taskID) - task_info = &state->ActiveTask; + if (state->active_task.task_id == task_id) { + task_info = &state->active_task; + } // wasn't task - if (task_info == nullptr) - for (int i = 0; i < MAXACTIVEQUESTS; i++) - if (state->ActiveQuests[i].TaskID == taskID) - task_info = &state->ActiveQuests[i]; + if (task_info == nullptr) { + for (auto & active_quest : state->active_quests) { + if (active_quest.task_id == task_id) { + task_info = &active_quest; + } + } + } if (task_info == nullptr) { - LogError("[TASKS]Activity [{}] found for task [{}] which client does not have", activityID, taskID); + LogTasks( + "[LoadClientState] Error: activity_id [{}] found for task_id [{}] which client does not have character_id [{}]", + activity_id, + task_id, + character_id + ); + continue; } - int doneCount = atoi(row[2]); - bool completed = atoi(row[3]); - task_info->Activity[activityID].ActivityID = activityID; - task_info->Activity[activityID].DoneCount = doneCount; - if (completed) - task_info->Activity[activityID].State = ActivityCompleted; - else - task_info->Activity[activityID].State = ActivityHidden; + int done_count = atoi(row[2]); + bool completed = atoi(row[3]); + task_info->activity[activity_id].activity_id = activity_id; + task_info->activity[activity_id].done_count = done_count; + if (completed) { + task_info->activity[activity_id].activity_state = ActivityCompleted; + } + else { + task_info->activity[activity_id].activity_state = ActivityHidden; + } - task_info->Activity[activityID].Updated = false; + task_info->activity[activity_id].updated = false; - Log(Logs::General, Logs::Tasks, - "[CLIENTLOAD] TaskManager::LoadClientState. Char: %i Task ID %i, ActivityID: %i, DoneCount: %i, " - "Completed: %i", - characterID, taskID, activityID, doneCount, completed); + LogTasks( + "[LoadClientState] character_id [{}] task_id [{}] activity_id [{}] done_count [{}] completed [{}]", + character_id, + task_id, + activity_id, + done_count, + completed + ); } if (RuleB(TaskSystem, RecordCompletedTasks)) { - query = StringFormat("SELECT `taskid`, `activityid`, `completedtime` " - "FROM `completed_tasks` " - "WHERE `charid` = %i ORDER BY completedtime, taskid, activityid", - characterID); + query = StringFormat( + "SELECT `taskid`, `activityid`, `completedtime` " + "FROM `completed_tasks` " + "WHERE `charid` = %i ORDER BY completedtime, taskid, activityid", + character_id + ); results = database.QueryDatabase(query); if (!results.Success()) { - LogError("[TASKS]Error in TaskManager::LoadClientState load completed tasks: [{}]", - results.ErrorMessage().c_str()); return false; } - CompletedTaskInformation cti; + CompletedTaskInformation completed_task_information{}; + for (bool & i : completed_task_information.activity_done) + i = false; - for (int i = 0; i < MAXACTIVITIESPERTASK; i++) - cti.ActivityDone[i] = false; - - int previousTaskID = -1; - int previousCompletedTime = -1; + int previous_task_id = -1; + int previous_completed_time = -1; for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - if ((taskID <= 0) || (taskID >= MAXTASKS)) { - LogError("[TASKS]Task ID [{}] out of range while loading completed tasks from database", - taskID); + int task_id = atoi(row[0]); + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + LogError("[TASKS]Task ID [{}] out of range while loading completed tasks from database", task_id); continue; } - // An ActivityID of -1 means mark all the none optional activities in the + // An activity_id of -1 means mark all the none optional activities in the // task as complete. If the Rule to record optional activities is enabled, // subsequent records for this task will flag any optional tasks that were // completed. - int activityID = atoi(row[1]); - if ((activityID < -1) || (activityID >= MAXACTIVITIESPERTASK)) { - LogError("[TASKS]Activity ID [{}] out of range while loading completed tasks from database", - activityID); + int activity_id = atoi(row[1]); + if ((activity_id < -1) || (activity_id >= MAXACTIVITIESPERTASK)) { + LogError("[TASKS]activity_information ID [{}] out of range while loading completed tasks from database", activity_id); continue; } - int completedTime = atoi(row[2]); - if ((previousTaskID != -1) && - ((taskID != previousTaskID) || (completedTime != previousCompletedTime))) { - state->CompletedTasks.push_back(cti); - for (int i = 0; i < MAXACTIVITIESPERTASK; i++) - cti.ActivityDone[i] = false; + int completed_time = atoi(row[2]); + if ((previous_task_id != -1) && + ((task_id != previous_task_id) || (completed_time != previous_completed_time))) { + state->completed_tasks.push_back(completed_task_information); + for (bool & activity_done : completed_task_information.activity_done) { + activity_done = false; + } } - cti.TaskID = previousTaskID = taskID; - cti.CompletedTime = previousCompletedTime = completedTime; + completed_task_information.task_id = previous_task_id = task_id; + completed_task_information.completed_time = previous_completed_time = completed_time; - // If ActivityID is -1, Mark all the non-optional tasks as completed. - if (activityID < 0) { - TaskInformation *task = Tasks[taskID]; - if (task == nullptr) + // If activity_id is -1, Mark all the non-optional tasks as completed. + if (activity_id < 0) { + TaskInformation *task = Tasks[task_id]; + if (task == nullptr) { continue; + } - for (int i = 0; i < task->ActivityCount; i++) - if (!task->Activity[i].Optional) - cti.ActivityDone[i] = true; - } else - cti.ActivityDone[activityID] = true; + for (int i = 0; i < task->activity_count; i++) { + if (!task->activity_information[i].Optional) { + completed_task_information.activity_done[i] = true; + } + } + } + else { + completed_task_information.activity_done[activity_id] = true; + } } - if (previousTaskID != -1) - state->CompletedTasks.push_back(cti); + if (previous_task_id != -1) { + state->completed_tasks.push_back(completed_task_information); + } - state->LastCompletedTaskLoaded = state->CompletedTasks.size(); + state->last_completed_task_loaded = state->completed_tasks.size(); } - query = StringFormat("SELECT `taskid` FROM character_enabledtasks " - "WHERE `charid` = %i AND `taskid` >0 AND `taskid` < %i " - "ORDER BY `taskid` ASC", - characterID, MAXTASKS); + query = StringFormat( + "SELECT `taskid` FROM character_enabledtasks " + "WHERE `charid` = %i AND `taskid` >0 AND `taskid` < %i " + "ORDER BY `taskid` ASC", + character_id, MAXTASKS + ); results = database.QueryDatabase(query); - if (!results.Success()) { - LogError("[TASKS]Error in TaskManager::LoadClientState load enabled tasks: [{}]", - results.ErrorMessage().c_str()); - } else { + if (results.Success()) { for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - state->EnabledTasks.push_back(taskID); - Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] Adding TaskID %i to enabled tasks", taskID); + int task_id = atoi(row[0]); + state->enabled_tasks.push_back(task_id); + LogTasksDetail("[LoadClientState] Adding task_id [{}] to enabled tasks", task_id); } } - // Check that there is an entry in the client task state for every activity in each task + // Check that there is an entry in the client task state for every activity_information in each task // This should only break if a ServerOP adds or deletes activites for a task that players already // have active, or due to a bug. for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - int taskID = state->ActiveTasks[i].TaskID; - if (taskID == TASKSLOTEMPTY) - continue; - if (!Tasks[taskID]) { - c->Message(Chat::Red, - "Active Task Slot %i, references a task (%i), that does not exist. " - "Removing from memory. Contact a GM to resolve this.", - i, taskID); - - LogError("[TASKS]Character [{}] has task [{}] which does not exist", - characterID, taskID); - state->ActiveTasks[i].TaskID = TASKSLOTEMPTY; + int task_id = state->ActiveTasks[i].task_id; + if (task_id == TASKSLOTEMPTY) { continue; } - for (int j = 0; j < Tasks[taskID]->ActivityCount; j++) { + if (!Tasks[task_id]) { + c->Message( + Chat::Red, + "Active Task Slot %i, references a task (%i), that does not exist. " + "Removing from memory. Contact a GM to resolve this.", + i, task_id + ); - if (state->ActiveTasks[i].Activity[j].ActivityID != j) { - c->Message(Chat::Red, - "Active Task %i, %s. Activity count does not match expected value." - "Removing from memory. Contact a GM to resolve this.", - taskID, Tasks[taskID]->Title.c_str()); + LogError("[LoadClientState] Character [{}] has task [{}] which does not exist", character_id, task_id); + state->ActiveTasks[i].task_id = TASKSLOTEMPTY; + continue; + } + for (int activity_index = 0; activity_index < Tasks[task_id]->activity_count; activity_index++) { + if (state->ActiveTasks[i].activity[activity_index].activity_id != activity_index) { + c->Message( + Chat::Red, + "Active Task %i, %s. activity_information count does not match expected value." + "Removing from memory. Contact a GM to resolve this.", + task_id, Tasks[task_id]->title.c_str() + ); - LogError("[TASKS]Fatal error in character [{}] task state. Activity [{}] for Task [{}] either missing from client state or from task", - characterID, j, taskID); - state->ActiveTasks[i].TaskID = TASKSLOTEMPTY; + LogTasks( + "[LoadClientState] Fatal error in character [{}] task state. activity_information [{}] for Task [{}] either missing from client state or from task", + character_id, + activity_index, + task_id + ); + state->ActiveTasks[i].task_id = TASKSLOTEMPTY; break; } } } - if (state->ActiveTask.TaskID != TASKSLOTEMPTY) - state->UnlockActivities(characterID, state->ActiveTask); - // TODO: shared - for (int i = 0; i < MAXACTIVEQUESTS; i++) - if (state->ActiveQuests[i].TaskID != TASKSLOTEMPTY) - state->UnlockActivities(characterID, state->ActiveQuests[i]); + if (state->active_task.task_id != TASKSLOTEMPTY) { + state->UnlockActivities(character_id, state->active_task); + } + + // TODO: shared + for (auto & active_quest : state->active_quests) { + if (active_quest.task_id != TASKSLOTEMPTY) { + state->UnlockActivities(character_id, active_quest); + } + } + + LogTasks( "[LoadClientState] for Character ID [{}}] DONE!", character_id); - Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] LoadClientState for Character ID %d DONE!", characterID); return true; } -void ClientTaskState::EnableTask(int characterID, int taskCount, int *tasks) { - +void ClientTaskState::EnableTask(int character_id, int task_count, int *tasks) +{ // Check if the Task is already enabled for this client - // - std::vector tasksEnabled; + std::vector tasks_enabled; + for (int i = 0; i < task_count; i++) { - for(int i=0; i tasks[i]) - break; + if ((*iterator) > tasks[i]) { + break; + } ++iterator; } - if(addTask) { - EnabledTasks.insert(iterator, tasks[i]); + if (addTask) { + enabled_tasks.insert(iterator, tasks[i]); // Make a note of the task we enabled, for later SQL generation - tasksEnabled.push_back(tasks[i]); + tasks_enabled.push_back(tasks[i]); } } - Log(Logs::General, Logs::Tasks, "[UPDATE] New enabled task list "); - for(unsigned int i=0; i tasksDisabled; - for(int i=0; i taskList[i]) - break; + if ((*iterator) > task_list[i]) { + break; + } ++iterator; } - if(removeTask) { - EnabledTasks.erase(iterator); - tasksDisabled.push_back(taskList[i]); + if (removeTask) { + enabled_tasks.erase(iterator); + tasksDisabled.push_back(task_list[i]); } } - Log(Logs::General, Logs::Tasks, "[UPDATE] New enabled task list "); - for(unsigned int i=0; i::iterator Iterator; - Iterator = EnabledTasks.begin(); + Iterator = enabled_tasks.begin(); - while(Iterator != EnabledTasks.end()) { - if((*Iterator) == TaskID) return true; - if((*Iterator) > TaskID) break; + while (Iterator != enabled_tasks.end()) { + if ((*Iterator) == TaskID) { return true; } + if ((*Iterator) > TaskID) { break; } ++Iterator; } return false; } -int ClientTaskState::EnabledTaskCount(int TaskSetID) { +int ClientTaskState::EnabledTaskCount(int TaskSetID) +{ // Return the number of tasks in TaskSet that this character is enabled for. unsigned int EnabledTaskIndex = 0; - unsigned int TaskSetIndex = 0; - int EnabledTaskCount = 0; + unsigned int TaskSetIndex = 0; + int EnabledTaskCount = 0; - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return -1; + if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { return -1; } - while((EnabledTaskIndex < EnabledTasks.size()) && (TaskSetIndex < taskmanager->TaskSets[TaskSetID].size())) { + while ((EnabledTaskIndex < enabled_tasks.size()) && (TaskSetIndex < p_task_manager->TaskSets[TaskSetID].size())) { - if(EnabledTasks[EnabledTaskIndex] == taskmanager->TaskSets[TaskSetID][TaskSetIndex]) { + if (enabled_tasks[EnabledTaskIndex] == p_task_manager->TaskSets[TaskSetID][TaskSetIndex]) { EnabledTaskCount++; EnabledTaskIndex++; @@ -848,120 +942,145 @@ int ClientTaskState::EnabledTaskCount(int TaskSetID) { continue; } - if(EnabledTasks[EnabledTaskIndex] < taskmanager->TaskSets[TaskSetID][TaskSetIndex]) + if (enabled_tasks[EnabledTaskIndex] < p_task_manager->TaskSets[TaskSetID][TaskSetIndex]) { EnabledTaskIndex++; - else + } + else { TaskSetIndex++; + } } return EnabledTaskCount; } -int ClientTaskState::ActiveTasksInSet(int TaskSetID) { +int ClientTaskState::ActiveTasksInSet(int TaskSetID) +{ - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return -1; + if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { return -1; } int Count = 0; - for(unsigned int i=0; iTaskSets[TaskSetID].size(); i++) - if(IsTaskActive(taskmanager->TaskSets[TaskSetID][i])) + for (unsigned int i = 0; i < p_task_manager->TaskSets[TaskSetID].size(); i++) + if (IsTaskActive(p_task_manager->TaskSets[TaskSetID][i])) { Count++; + } return Count; } -int ClientTaskState::CompletedTasksInSet(int TaskSetID) { +int ClientTaskState::CompletedTasksInSet(int TaskSetID) +{ - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return -1; + if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { return -1; } int Count = 0; - for(unsigned int i=0; iTaskSets[TaskSetID].size(); i++) - if(IsTaskCompleted(taskmanager->TaskSets[TaskSetID][i])) + for (unsigned int i = 0; i < p_task_manager->TaskSets[TaskSetID].size(); i++) + if (IsTaskCompleted(p_task_manager->TaskSets[TaskSetID][i])) { Count++; + } return Count; } bool ClientTaskState::HasSlotForTask(TaskInformation *task) { - if (task == nullptr) + if (task == nullptr) { return false; + } switch (task->type) { - case TaskType::Task: - return ActiveTask.TaskID == TASKSLOTEMPTY; - case TaskType::Shared: - return false; // todo - case TaskType::Quest: - for (int i = 0; i < MAXACTIVEQUESTS; ++i) - if (ActiveQuests[i].TaskID == TASKSLOTEMPTY) - return true; - case TaskType::E: - return false; // removed on live + case TaskType::Task: + return active_task.task_id == TASKSLOTEMPTY; + case TaskType::Shared: + return false; // todo + case TaskType::Quest: + for (int i = 0; i < MAXACTIVEQUESTS; ++i) + if (active_quests[i].task_id == TASKSLOTEMPTY) { + return true; + } + case TaskType::E: + return false; // removed on live } return false; } -int TaskManager::FirstTaskInSet(int TaskSetID) { +int TaskManager::FirstTaskInSet(int TaskSetID) +{ - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return 0; + if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { return 0; } - if(TaskSets[TaskSetID].empty()) return 0; + if (TaskSets[TaskSetID].empty()) { return 0; } auto Iterator = TaskSets[TaskSetID].begin(); - while(Iterator != TaskSets[TaskSetID].end()) { - if((*Iterator) > 0) + while (Iterator != TaskSets[TaskSetID].end()) { + if ((*Iterator) > 0) { return (*Iterator); + } ++Iterator; } return 0; } -int TaskManager::LastTaskInSet(int TaskSetID) { +int TaskManager::LastTaskInSet(int TaskSetID) +{ + if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { + return 0; + } - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return 0; + if (TaskSets[TaskSetID].empty()) { + return 0; + } - if(TaskSets[TaskSetID].empty()) return 0; - - return TaskSets[TaskSetID][TaskSets[TaskSetID].size()-1]; + return TaskSets[TaskSetID][TaskSets[TaskSetID].size() - 1]; } -int TaskManager::NextTaskInSet(int TaskSetID, int TaskID) { +int TaskManager::NextTaskInSet(int TaskSetID, int TaskID) +{ + if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { + return 0; + } - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return 0; + if (TaskSets[TaskSetID].empty()) { + return 0; + } - if(TaskSets[TaskSetID].empty()) return 0; - - for(unsigned int i=0; i TaskID) return TaskSets[TaskSetID][i]; + for (int i : TaskSets[TaskSetID]) { + if (i > TaskID) { + return i; + } } return 0; } -bool TaskManager::AppropriateLevel(int TaskID, int PlayerLevel) { +bool TaskManager::ValidateLevel(int TaskID, int PlayerLevel) +{ + if (Tasks[TaskID] == nullptr) { + return false; + } - if(Tasks[TaskID] == nullptr) return false; + if (Tasks[TaskID]->min_level && (PlayerLevel < Tasks[TaskID]->min_level)) { + return false; + } - if(Tasks[TaskID]->MinLevel && (PlayerLevel < Tasks[TaskID]->MinLevel)) return false; - - if(Tasks[TaskID]->MaxLevel && (PlayerLevel > Tasks[TaskID]->MaxLevel)) return false; + if (Tasks[TaskID]->max_level && (PlayerLevel > Tasks[TaskID]->max_level)) { + return false; + } return true; - } std::string TaskManager::GetTaskName(uint32 task_id) { if (task_id > 0 && task_id < MAXTASKS) { if (Tasks[task_id] != nullptr) { - return Tasks[task_id]->Title; + return Tasks[task_id]->title; } } @@ -980,9 +1099,8 @@ TaskType TaskManager::GetTaskType(uint32 task_id) int TaskManager::GetTaskMinLevel(int TaskID) { - if (Tasks[TaskID]->MinLevel) - { - return Tasks[TaskID]->MinLevel; + if (Tasks[TaskID]->min_level) { + return Tasks[TaskID]->min_level; } return -1; @@ -990,9 +1108,8 @@ int TaskManager::GetTaskMinLevel(int TaskID) int TaskManager::GetTaskMaxLevel(int TaskID) { - if (Tasks[TaskID]->MaxLevel) - { - return Tasks[TaskID]->MaxLevel; + if (Tasks[TaskID]->max_level) { + return Tasks[TaskID]->max_level; } return -1; @@ -1002,13 +1119,13 @@ void TaskManager::TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, i { int TaskList[MAXCHOOSERENTRIES]; int TaskListIndex = 0; - int PlayerLevel = c->GetLevel(); + int PlayerLevel = c->GetLevel(); - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSetSelector called for taskset %i. EnableTaskSize is %i", - TaskSetID, state->EnabledTasks.size()); + LogTasks("TaskSetSelector called for taskset [{}]. EnableTaskSize is [{}]", TaskSetID, state->enabled_tasks.size()); - if (TaskSetID <= 0 || TaskSetID >= MAXTASKSETS) + if (TaskSetID <= 0 || TaskSetID >= MAXTASKSETS) { return; + } if (TaskSets[TaskSetID].empty()) { mob->SayString(c, Chat::Yellow, MAX_ACTIVE_TASKS, c->GetName()); // I think this is suppose to be yellow @@ -1017,7 +1134,7 @@ void TaskManager::TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, i bool all_enabled = false; - // A TaskID of 0 in a TaskSet indicates that all Tasks in the set are enabled for all players. + // A task_id of 0 in a TaskSet indicates that all Tasks in the set are enabled for all players. if (TaskSets[TaskSetID][0] == 0) { Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSets[%i][0] == 0. All Tasks in Set enabled.", TaskSetID); all_enabled = true; @@ -1025,94 +1142,114 @@ void TaskManager::TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, i auto Iterator = TaskSets[TaskSetID].begin(); - if (all_enabled) - ++Iterator; // skip first when all enabled since it's useless data + if (all_enabled) { + ++Iterator; + } // skip first when all enabled since it's useless data while (Iterator != TaskSets[TaskSetID].end() && TaskListIndex < MAXCHOOSERENTRIES) { auto task = *Iterator; // verify level, we're not currently on it, repeatable status, if it's a (shared) task // we aren't currently on another, and if it's enabled if not all_enabled - if ((all_enabled || state->IsTaskEnabled(task)) && AppropriateLevel(task, PlayerLevel) && - !state->IsTaskActive(task) && state->HasSlotForTask(Tasks[task]) && // this slot checking is a bit silly, but we allow mixing of task types ... - (IsTaskRepeatable(task) || !state->IsTaskCompleted(task))) + if ((all_enabled || state->IsTaskEnabled(task)) && ValidateLevel(task, PlayerLevel) && + !state->IsTaskActive(task) && state->HasSlotForTask(Tasks[task]) && + // this slot checking is a bit silly, but we allow mixing of task types ... + (IsTaskRepeatable(task) || !state->IsTaskCompleted(task))) { TaskList[TaskListIndex++] = task; + } ++Iterator; } if (TaskListIndex > 0) { SendTaskSelector(c, mob, TaskListIndex, TaskList); - } else { - mob->SayString(c, Chat::Yellow, MAX_ACTIVE_TASKS, c->GetName()); // check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow } - - return; + else { + // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow + mob->SayString( + c, + Chat::Yellow, + MAX_ACTIVE_TASKS, + c->GetName() + ); + } } // unlike the non-Quest version of this function, it does not check enabled, that is assumed the responsibility of the quest to handle // we do however still want it to check the other stuff like level, active, room, etc void TaskManager::TaskQuestSetSelector(Client *c, ClientTaskState *state, Mob *mob, int count, int *tasks) { - int TaskList[MAXCHOOSERENTRIES]; - int TaskListIndex = 0; - int PlayerLevel = c->GetLevel(); + int task_list[MAXCHOOSERENTRIES]; + int task_list_index = 0; + int player_level = c->GetLevel(); - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskQuestSetSelector called for array size %d", count); + LogTasks("[UPDATE] TaskQuestSetSelector called for array size [{}]", count); - if (count <= 0) + if (count <= 0) { return; + } for (int i = 0; i < count; ++i) { auto task = tasks[i]; // verify level, we're not currently on it, repeatable status, if it's a (shared) task // we aren't currently on another, and if it's enabled if not all_enabled - if (AppropriateLevel(task, PlayerLevel) && - !state->IsTaskActive(task) && state->HasSlotForTask(Tasks[task]) && // this slot checking is a bit silly, but we allow mixing of task types ... - (IsTaskRepeatable(task) || !state->IsTaskCompleted(task))) - TaskList[TaskListIndex++] = task; + if (ValidateLevel(task, player_level) && !state->IsTaskActive(task) && state->HasSlotForTask(Tasks[task]) && + // this slot checking is a bit silly, but we allow mixing of task types ... + (IsTaskRepeatable(task) || !state->IsTaskCompleted(task))) { + task_list[task_list_index++] = task; + } } - if (TaskListIndex > 0) { - SendTaskSelector(c, mob, TaskListIndex, TaskList); - } else { - mob->SayString(c, Chat::Yellow, MAX_ACTIVE_TASKS, c->GetName()); // check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow + if (task_list_index > 0) { + SendTaskSelector(c, mob, task_list_index, task_list); + } + else { + // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow + mob->SayString( + c, + Chat::Yellow, + MAX_ACTIVE_TASKS, + c->GetName() + ); } - - return; } -void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *TaskList) { - - if (c->ClientVersion() >= EQ::versions::ClientVersion::RoF) - { +// sends task selector to client +void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *TaskList) +{ + if (c->ClientVersion() >= EQ::versions::ClientVersion::RoF) { SendTaskSelectorNew(c, mob, TaskCount, TaskList); return; } // Titanium OpCode: 0x5e7c - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSelector for %i Tasks", TaskCount); + LogTasks("TaskSelector for [{}] Tasks", TaskCount); int PlayerLevel = c->GetLevel(); // Check if any of the tasks exist for (int i = 0; i < TaskCount; i++) { - if (Tasks[TaskList[i]] != nullptr) + if (Tasks[TaskList[i]] != nullptr) { break; + } } int ValidTasks = 0; for (int i = 0; i < TaskCount; i++) { - if (!AppropriateLevel(TaskList[i], PlayerLevel)) + if (!ValidateLevel(TaskList[i], PlayerLevel)) { continue; - if (c->IsTaskActive(TaskList[i])) + } + if (c->IsTaskActive(TaskList[i])) { continue; - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) + } + if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) { continue; + } ValidTasks++; } - if (ValidTasks == 0) + if (ValidTasks == 0) { return; + } SerializeBuffer buf(50 * ValidTasks); @@ -1122,38 +1259,43 @@ void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *Task buf.WriteUInt32(mob->GetID()); for (int i = 0; i < TaskCount; i++) { - if (!AppropriateLevel(TaskList[i], PlayerLevel)) + if (!ValidateLevel(TaskList[i], PlayerLevel)) { continue; - if (c->IsTaskActive(TaskList[i])) + } + if (c->IsTaskActive(TaskList[i])) { continue; - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) + } + if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) { continue; + } - buf.WriteUInt32(TaskList[i]); // TaskID - if (c->ClientVersion() != EQ::versions::ClientVersion::Titanium) - buf.WriteFloat(1.0f); // affects color, difficulty? - buf.WriteUInt32(Tasks[TaskList[i]]->Duration); - buf.WriteUInt32(static_cast(Tasks[TaskList[i]]->dur_code)); + buf.WriteUInt32(TaskList[i]); // task_id - buf.WriteString(Tasks[TaskList[i]]->Title); // max 64 with null - buf.WriteString(Tasks[TaskList[i]]->Description); // max 4000 with null + // affects color, difficulty? + if (c->ClientVersion() != EQ::versions::ClientVersion::Titanium) { + buf.WriteFloat(1.0f); + } + buf.WriteUInt32(Tasks[TaskList[i]]->duration); + buf.WriteUInt32(static_cast(Tasks[TaskList[i]]->duration_code)); - if (c->ClientVersion() != EQ::versions::ClientVersion::Titanium) - buf.WriteUInt8(0); // Has reward set flag + buf.WriteString(Tasks[TaskList[i]]->title); // max 64 with null + buf.WriteString(Tasks[TaskList[i]]->description); // max 4000 with null - buf.WriteUInt32(Tasks[TaskList[i]]->ActivityCount); + // Has reward set flag + if (c->ClientVersion() != EQ::versions::ClientVersion::Titanium) { + buf.WriteUInt8(0); + } - for (int j = 0; j < Tasks[TaskList[i]]->ActivityCount; ++j) { - buf.WriteUInt32(j); // ActivityNumber - auto &activity = Tasks[TaskList[i]]->Activity[j]; + buf.WriteUInt32(Tasks[TaskList[i]]->activity_count); + + for (int j = 0; j < Tasks[TaskList[i]]->activity_count; ++j) { + buf.WriteUInt32(j); // ActivityNumber + auto &activity = Tasks[TaskList[i]]->activity_information[j]; buf.WriteUInt32(activity.Type); - buf.WriteUInt32(0); // solo, group, raid? - buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) - - buf.WriteString(activity.item_list); // max length 64 in these clients - + buf.WriteUInt32(0); // solo, group, raid? + buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) + buf.WriteString(activity.item_list); // max length 64 in these clients buf.WriteUInt32(activity.GoalCount); - buf.WriteInt32(activity.skill_id); buf.WriteInt32(activity.spell_id); buf.WriteInt32(activity.ZoneIDs.empty() ? 0 : activity.ZoneIDs.front()); @@ -1165,74 +1307,82 @@ void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *Task c->QueuePacket(outapp); safe_delete(outapp); - } void TaskManager::SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *TaskList) { - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSelector for %i Tasks", TaskCount); + LogTasks("SendTaskSelectorNew for [{}] Tasks", TaskCount); int PlayerLevel = c->GetLevel(); // Check if any of the tasks exist - for (int i = 0; i < TaskCount; i++) - if (Tasks[TaskList[i]] != nullptr) + for (int i = 0; i < TaskCount; i++) { + if (Tasks[TaskList[i]] != nullptr) { break; + } + } int ValidTasks = 0; for (int i = 0; i < TaskCount; i++) { - if (!AppropriateLevel(TaskList[i], PlayerLevel)) + if (!ValidateLevel(TaskList[i], PlayerLevel)) { continue; - if (c->IsTaskActive(TaskList[i])) + } + if (c->IsTaskActive(TaskList[i])) { continue; - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) + } + if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) { continue; + } ValidTasks++; } - if (ValidTasks == 0) + if (ValidTasks == 0) { return; + } SerializeBuffer buf(50 * ValidTasks); - buf.WriteUInt32(ValidTasks); // TaskCount - buf.WriteUInt32(2); // Type, valid values: 0-3. 0 = Task, 1 = Shared Task, 2 = Quest, 3 = ??? -- should fix maybe some day, but we let more than 1 type through :P + buf.WriteUInt32(ValidTasks); // TaskCount + buf.WriteUInt32(2); // Type, valid values: 0-3. 0 = Task, 1 = Shared Task, 2 = Quest, 3 = ??? -- should fix maybe some day, but we let more than 1 type through :P // so I guess an NPC can only offer one type of quests or we can only open a selection with one type :P (so quest call can tell us I guess) // this is also sent in OP_TaskDescription - buf.WriteUInt32(mob->GetID()); // TaskGiver + buf.WriteUInt32(mob->GetID()); // TaskGiver for (int i = 0; i < TaskCount; i++) { // max 40 - if (!AppropriateLevel(TaskList[i], PlayerLevel)) + if (!ValidateLevel(TaskList[i], PlayerLevel)) { continue; - if (c->IsTaskActive(TaskList[i])) + } + if (c->IsTaskActive(TaskList[i])) { continue; - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) + } + if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) { continue; + } - buf.WriteUInt32(TaskList[i]); // TaskID + buf.WriteUInt32(TaskList[i]); // task_id buf.WriteFloat(1.0f); // affects color, difficulty? - buf.WriteUInt32(Tasks[TaskList[i]]->Duration); - buf.WriteUInt32(static_cast(Tasks[TaskList[i]]->dur_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited + buf.WriteUInt32(Tasks[TaskList[i]]->duration); + buf.WriteUInt32(static_cast(Tasks[TaskList[i]]->duration_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited - buf.WriteString(Tasks[TaskList[i]]->Title); // max 64 with null - buf.WriteString(Tasks[TaskList[i]]->Description); // max 4000 with null + buf.WriteString(Tasks[TaskList[i]]->title); // max 64 with null + buf.WriteString(Tasks[TaskList[i]]->description); // max 4000 with null - buf.WriteUInt8(0); // Has reward set flag - buf.WriteUInt32(Tasks[TaskList[i]]->ActivityCount); // ActivityCount + buf.WriteUInt8(0); // Has reward set flag + buf.WriteUInt32(Tasks[TaskList[i]]->activity_count); // activity_count - for (int j = 0; j < Tasks[TaskList[i]]->ActivityCount; ++j) { - buf.WriteUInt32(j); // ActivityNumber - auto &activity = Tasks[TaskList[i]]->Activity[j]; - buf.WriteUInt32(activity.Type); // ActivityType - buf.WriteUInt32(0); // solo, group, raid? - buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) + for (int j = 0; j < Tasks[TaskList[i]]->activity_count; ++j) { + buf.WriteUInt32(j); // ActivityNumber + auto &activity = Tasks[TaskList[i]]->activity_information[j]; + buf.WriteUInt32(activity.Type); // ActivityType + buf.WriteUInt32(0); // solo, group, raid? + buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) // this string is item names buf.WriteLengthString(activity.item_list); - buf.WriteUInt32(activity.GoalCount); // GoalCount + buf.WriteUInt32(activity.GoalCount); // GoalCount // this string is skill IDs? probably one of the "use on" tasks buf.WriteLengthString(activity.skill_list); @@ -1240,11 +1390,11 @@ void TaskManager::SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *T // this string is spell IDs? probably one of the "use on" tasks buf.WriteLengthString(activity.spell_list); - //buf.WriteString(itoa(Tasks[TaskList[i]]->Activity[ActivityID].ZoneID)); - buf.WriteString(activity.zones); // Zone number in ascii max length 64, can be multiple with separated by ; - buf.WriteString(activity.desc_override); // max length 128 -- overrides the automatic descriptions + //buf.WriteString(itoa(Tasks[TaskList[i]]->activity_information[activity_id].ZoneID)); + buf.WriteString(activity.zones); // Zone number in ascii max length 64, can be multiple with separated by ; + buf.WriteString(activity.desc_override); // max length 128 -- overrides the automatic descriptions // this doesn't appear to be shown to the client at all and isn't the same as zones ... defaults to '0' though - buf.WriteString(activity.zones); // Zone number in ascii max length 64, probably can be separated by ; too, haven't found it used + buf.WriteString(activity.zones); // Zone number in ascii max length 64, probably can be separated by ; too, haven't found it used } } @@ -1252,47 +1402,50 @@ void TaskManager::SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *T c->QueuePacket(outapp); safe_delete(outapp); - } -int TaskManager::GetActivityCount(int TaskID) { +int TaskManager::GetActivityCount(int TaskID) +{ // Return the total number of activities in a particular task. - if((TaskID>0) && (TaskIDActivityCount; + if ((TaskID > 0) && (TaskID < MAXTASKS)) { + if (Tasks[TaskID]) { return Tasks[TaskID]->activity_count; } + } return 0; } -void TaskManager::ExplainTask(Client*c, int TaskID) { +void TaskManager::ExplainTask(Client *c, int TaskID) +{ // TODO: This method is not finished (hardly started). It was intended to - // explain in English, what each activity did, conditions for step unlocking, etc. + // explain in English, what each activity_information did, conditions for step unlocking, etc. // return; - if(!c) return; + if (!c) { return; } - if((TaskID<=0) || (TaskID>=MAXTASKS)) { - c->Message(Chat::White, "TaskID out-of-range."); + if ((TaskID <= 0) || (TaskID >= MAXTASKS)) { + c->Message(Chat::White, "task_id out-of-range."); return; } - if(Tasks[TaskID] == nullptr) { + if (Tasks[TaskID] == nullptr) { c->Message(Chat::White, "Task does not exist."); return; } - char Explanation[1000], *ptr; - c->Message(Chat::White, "Task %4i: Title: %s", TaskID, Tasks[TaskID]->Description.c_str()); - c->Message(Chat::White, "%3i Activities", Tasks[TaskID]->ActivityCount); - ptr = Explanation; - for(int i=0; iActivityCount; i++) { + char explanation[1000], *ptr; + c->Message(Chat::White, "Task %4i: title: %s", TaskID, Tasks[TaskID]->description.c_str()); + c->Message(Chat::White, "%3i Activities", Tasks[TaskID]->activity_count); + ptr = explanation; + for (int i = 0; i < Tasks[TaskID]->activity_count; i++) { - sprintf(ptr, "Act: %3i: ", i); ptr = ptr + strlen(ptr); - switch(Tasks[TaskID]->Activity[i].Type) { + sprintf(ptr, "Act: %3i: ", i); + ptr = ptr + strlen(ptr); + switch (Tasks[TaskID]->activity_information[i].Type) { case ActivityDeliver: sprintf(ptr, "Deliver"); break; @@ -1301,118 +1454,125 @@ void TaskManager::ExplainTask(Client*c, int TaskID) { } } -ClientTaskState::ClientTaskState() { - - ActiveTaskCount = 0; - LastCompletedTaskLoaded = 0; - CheckedTouchActivities = false; +ClientTaskState::ClientTaskState() +{ + active_task_count = 0; + last_completed_task_loaded = 0; + checked_touch_activities = false; for (int i = 0; i < MAXACTIVEQUESTS; i++) { - ActiveQuests[i].slot = i; - ActiveQuests[i].TaskID = TASKSLOTEMPTY; + active_quests[i].slot = i; + active_quests[i].task_id = TASKSLOTEMPTY; } - ActiveTask.slot = 0; - ActiveTask.TaskID = TASKSLOTEMPTY; + active_task.slot = 0; + active_task.task_id = TASKSLOTEMPTY; // TODO: shared task } -ClientTaskState::~ClientTaskState() { +ClientTaskState::~ClientTaskState() +{ } -int ClientTaskState::GetActiveTaskID(int index) { +int ClientTaskState::GetActiveTaskID(int index) +{ - // Return the TaskID from the client's specified Active Task slot. - - if((index<0) || (index>=MAXACTIVEQUESTS)) return 0; - - return ActiveQuests[index].TaskID; -} - -static void DeleteCompletedTaskFromDatabase(int charID, int taskID) { - - Log(Logs::General, Logs::Tasks, "[UPDATE] DeleteCompletedTasksFromDatabase. CharID = %i, TaskID = %i", charID, taskID); - - const std::string query = StringFormat("DELETE FROM completed_tasks WHERE charid=%i AND taskid = %i", charID, taskID); - auto results = database.QueryDatabase(query); - if(!results.Success()) { - return; + // Return the task_id from the client's specified Active Task slot. + if ((index < 0) || (index >= MAXACTIVEQUESTS)) { + return 0; } - Log(Logs::General, Logs::Tasks, "[UPDATE] Delete query %s", query.c_str()); + return active_quests[index].task_id; } -bool ClientTaskState::UnlockActivities(int CharID, ClientTaskInformation &task_info) +static void DeleteCompletedTaskFromDatabase(int character_id, int task_id) { - bool AllActivitiesComplete = true; + LogTasks("[DeleteCompletedTasksFromDatabase] character_id [{}], task_id [{}]", character_id, task_id); - TaskInformation* Task = taskmanager->Tasks[task_info.TaskID]; + CompletedTasksRepository::DeleteWhere( + database, + fmt::format("charid = {} and taskid = {}", character_id, task_id) + ); +} - if (Task == nullptr) +bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation &task_info) +{ + bool all_activities_complete = true; + + TaskInformation *p_task_information = p_task_manager->Tasks[task_info.task_id]; + if (p_task_information == nullptr) { return true; + } // On loading the client state, all activities that are not completed, are // marked as hidden. For Sequential (non-stepped) mode, we mark the first - // activity as active if not complete. - Log(Logs::General, Logs::Tasks, "[UPDATE] CharID: %i Task: %i Sequence mode is %i", - CharID, task_info.TaskID, Task->SequenceMode); + // activity_information as active if not complete. + LogTasks( + "character_id [{}] task_id [{}] sequence_mode [{}]", + character_id, + task_info.task_id, + p_task_information->sequence_mode + ); - if (Task->SequenceMode == ActivitiesSequential) { - if (task_info.Activity[0].State != ActivityCompleted) - task_info.Activity[0].State = ActivityActive; + if (p_task_information->sequence_mode == ActivitiesSequential) { + if (task_info.activity[0].activity_state != ActivityCompleted) { + task_info.activity[0].activity_state = ActivityActive; + } // Enable the next Hidden task. - for (int i = 0; i < Task->ActivityCount; i++) { - if ((task_info.Activity[i].State == ActivityActive) && - (!Task->Activity[i].Optional)) { - AllActivitiesComplete = false; + for (int i = 0; i < p_task_information->activity_count; i++) { + if ((task_info.activity[i].activity_state == ActivityActive) && + (!p_task_information->activity_information[i].Optional)) { + all_activities_complete = false; break; } - if (task_info.Activity[i].State == ActivityHidden) { - task_info.Activity[i].State = ActivityActive; - AllActivitiesComplete = false; + if (task_info.activity[i].activity_state == ActivityHidden) { + task_info.activity[i].activity_state = ActivityActive; + all_activities_complete = false; break; } } - if (AllActivitiesComplete && RuleB(TaskSystem, RecordCompletedTasks)) { + if (all_activities_complete && RuleB(TaskSystem, RecordCompletedTasks)) { if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { - Log(Logs::General, Logs::Tasks, "[UPDATE] KeepOneRecord enabled"); - auto Iterator = CompletedTasks.begin(); - int ErasedElements = 0; - while (Iterator != CompletedTasks.end()) { - int TaskID = (*Iterator).TaskID; - if (TaskID == task_info.TaskID) { - Iterator = CompletedTasks.erase(Iterator); - ErasedElements++; - } else - ++Iterator; + LogTasks("KeepOneRecord enabled"); + auto iterator = completed_tasks.begin(); + int erased_elements = 0; + while (iterator != completed_tasks.end()) { + int task_id = (*iterator).task_id; + if (task_id == task_info.task_id) { + iterator = completed_tasks.erase(iterator); + erased_elements++; + } + else { + ++iterator; + } } - Log(Logs::General, Logs::Tasks, "[UPDATE] Erased Element count is %i", ErasedElements); + LogTasks("Erased Element count is [{}]", erased_elements); - if (ErasedElements) { - LastCompletedTaskLoaded -= ErasedElements; - DeleteCompletedTaskFromDatabase(CharID, task_info.TaskID); + if (erased_elements) { + last_completed_task_loaded -= erased_elements; + DeleteCompletedTaskFromDatabase(character_id, task_info.task_id); } } - CompletedTaskInformation cti; - cti.TaskID = task_info.TaskID; - cti.CompletedTime = time(nullptr); + CompletedTaskInformation completed_task_information{}; + completed_task_information.task_id = task_info.task_id; + completed_task_information.completed_time = time(nullptr); - for (int i = 0; i < Task->ActivityCount; i++) - cti.ActivityDone[i] = (task_info.Activity[i].State == ActivityCompleted); + for (int i = 0; i < p_task_information->activity_count; i++) { + completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == ActivityCompleted); + } - CompletedTasks.push_back(cti); + completed_tasks.push_back(completed_task_information); } - Log(Logs::General, Logs::Tasks, "[UPDATE] Returning sequential task, AllActivitiesComplete is %i", - AllActivitiesComplete); + LogTasks("Returning sequential task, AllActivitiesComplete is [{}]", all_activities_complete); - return AllActivitiesComplete; + return all_activities_complete; } // Stepped Mode @@ -1420,242 +1580,264 @@ bool ClientTaskState::UnlockActivities(int CharID, ClientTaskInformation &task_i bool CurrentStepComplete = true; - Log(Logs::General, Logs::Tasks, "[UPDATE] Current Step is %i, Last Step is %i", task_info.CurrentStep, - Task->LastStep); - // If CurrentStep is -1, this is the first call to this method since loading the + Log(Logs::General, Logs::Tasks, "[UPDATE] Current Step is %i, Last Step is %i", task_info.current_step, + p_task_information->last_step); + // If current_step is -1, this is the first call to this method since loading the // client state. Unlock all activities with a step number of 0 - if (task_info.CurrentStep == -1) { - for (int i = 0; i < Task->ActivityCount; i++) { - if (Task->Activity[i].StepNumber == 0 && task_info.Activity[i].State == ActivityHidden) { - task_info.Activity[i].State = ActivityActive; - // task_info.Activity[i].Updated=true; + if (task_info.current_step == -1) { + for (int i = 0; i < p_task_information->activity_count; i++) { + if (p_task_information->activity_information[i].StepNumber == 0 && task_info.activity[i].activity_state == ActivityHidden) { + task_info.activity[i].activity_state = ActivityActive; + // task_info.activity_information[i].updated=true; } } - task_info.CurrentStep = 0; + task_info.current_step = 0; } - for (int Step = task_info.CurrentStep; Step <= Task->LastStep; Step++) { - for (int Activity = 0; Activity < Task->ActivityCount; Activity++) { - if (Task->Activity[Activity].StepNumber == (int)task_info.CurrentStep) { - if ((task_info.Activity[Activity].State != ActivityCompleted) && - (!Task->Activity[Activity].Optional)) { - CurrentStepComplete = false; - AllActivitiesComplete = false; + for (int Step = task_info.current_step; Step <= p_task_information->last_step; Step++) { + for (int Activity = 0; Activity < p_task_information->activity_count; Activity++) { + if (p_task_information->activity_information[Activity].StepNumber == (int) task_info.current_step) { + if ((task_info.activity[Activity].activity_state != ActivityCompleted) && + (!p_task_information->activity_information[Activity].Optional)) { + CurrentStepComplete = false; + all_activities_complete = false; break; } } } - if (!CurrentStepComplete) + if (!CurrentStepComplete) { break; - task_info.CurrentStep++; + } + task_info.current_step++; } - if (AllActivitiesComplete) { + if (all_activities_complete) { if (RuleB(TaskSystem, RecordCompletedTasks)) { // If we are only keeping one completed record per task, and the player has done // the same task again, erase the previous completed entry for this task. if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { - Log(Logs::General, Logs::Tasks, "[UPDATE] KeepOneRecord enabled"); - auto Iterator = CompletedTasks.begin(); - int ErasedElements = 0; + LogTasksDetail("[UnlockActivities] KeepOneRecord enabled"); + auto iterator = completed_tasks.begin(); + int erased_elements = 0; - while (Iterator != CompletedTasks.end()) { - int TaskID = (*Iterator).TaskID; - if (TaskID == task_info.TaskID) { - Iterator = CompletedTasks.erase(Iterator); - ErasedElements++; - } else - ++Iterator; + while (iterator != completed_tasks.end()) { + int task_id = (*iterator).task_id; + if (task_id == task_info.task_id) { + iterator = completed_tasks.erase(iterator); + erased_elements++; + } + else { + ++iterator; + } } - Log(Logs::General, Logs::Tasks, "[UPDATE] Erased Element count is %i", ErasedElements); + LogTasksDetail("[UnlockActivities] Erased Element count is [{}]", erased_elements); - if (ErasedElements) { - LastCompletedTaskLoaded -= ErasedElements; - DeleteCompletedTaskFromDatabase(CharID, task_info.TaskID); + if (erased_elements) { + last_completed_task_loaded -= erased_elements; + DeleteCompletedTaskFromDatabase(character_id, task_info.task_id); } } - CompletedTaskInformation cti; - cti.TaskID = task_info.TaskID; - cti.CompletedTime = time(nullptr); + CompletedTaskInformation completed_task_information{}; + completed_task_information.task_id = task_info.task_id; + completed_task_information.completed_time = time(nullptr); - for (int i = 0; i < Task->ActivityCount; i++) - cti.ActivityDone[i] = (task_info.Activity[i].State == ActivityCompleted); - - CompletedTasks.push_back(cti); + for (int i = 0; i < p_task_information->activity_count; i++) { + completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == ActivityCompleted); + } + + completed_tasks.push_back(completed_task_information); } return true; } // Mark all non-completed tasks in the current step as active - // - for (int Activity = 0; Activity < Task->ActivityCount; Activity++) { - if ((Task->Activity[Activity].StepNumber == (int)task_info.CurrentStep) && - (task_info.Activity[Activity].State == ActivityHidden)) { - task_info.Activity[Activity].State = ActivityActive; - task_info.Activity[Activity].Updated = true; + for (int activity = 0; activity < p_task_information->activity_count; activity++) { + if ((p_task_information->activity_information[activity].StepNumber == (int) task_info.current_step) && + (task_info.activity[activity].activity_state == ActivityHidden)) { + task_info.activity[activity].activity_state = ActivityActive; + task_info.activity[activity].updated = true; } } return false; } -void ClientTaskState::UpdateTasksOnKill(Client *c, int NPCTypeID) { - +void ClientTaskState::UpdateTasksOnKill(Client *c, int NPCTypeID) +{ UpdateTasksByNPC(c, ActivityKill, NPCTypeID); - } -bool ClientTaskState::UpdateTasksOnSpeakWith(Client *c, int NPCTypeID) { - +bool ClientTaskState::UpdateTasksOnSpeakWith(Client *c, int NPCTypeID) +{ return UpdateTasksByNPC(c, ActivitySpeakWith, NPCTypeID); - } -bool ClientTaskState::UpdateTasksByNPC(Client *c, int ActivityType, int NPCTypeID) { +bool ClientTaskState::UpdateTasksByNPC(Client *c, int activity_type, int npc_type_id) +{ - int Ret = false; - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasks for NPCTypeID: %d", NPCTypeID); + int is_updating = false; // If the client has no tasks, there is nothing further to check. - - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return false; + } // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) + for (auto & ActiveTask : ActiveTasks) { + auto current_task = &ActiveTask; + if (current_task->task_id == TASKSLOTEMPTY) { continue; + } - // Check if there are any active kill activities for this task - - auto Task = taskmanager->Tasks[cur_task->TaskID]; - - if (Task == nullptr) + // Check if there are any active kill activities for this p_task_information + auto p_task_information = p_task_manager->Tasks[current_task->task_id]; + if (p_task_information == nullptr) { return false; + } - for (int j = 0; j < Task->ActivityCount; j++) { + for (int activity_id = 0; activity_id < p_task_information->activity_count; activity_id++) { // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) + if (current_task->activity[activity_id].activity_state != ActivityActive) { continue; + } // We are only interested in Kill activities - if (Task->Activity[j].Type != ActivityType) - continue; - // Is there a zone restriction on the activity ? - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] Char: %s Task: %i, Activity %i, Activity type %i for NPC %i failed zone " - "check", - c->GetName(), cur_task->TaskID, j, ActivityType, NPCTypeID); + if (p_task_information->activity_information[activity_id].Type != activity_type) { continue; } - // Is the activity to kill this type of NPC ? - switch (Task->Activity[j].GoalMethod) { - - case METHODSINGLEID: - if (Task->Activity[j].GoalID != NPCTypeID) - continue; - break; - - case METHODLIST: - if (!taskmanager->GoalListManager.IsInList(Task->Activity[j].GoalID, NPCTypeID)) - continue; - break; - - default: - // If METHODQUEST, don't update the activity here + // Is there a zone restriction on the activity_information ? + if (!p_task_information->activity_information[activity_id].CheckZone(zone->GetZoneID())) { + LogTasks( + "[UPDATE] character [{}] task_id [{}] activity_id [{}] activity_type [{}] for NPC [{}] failed zone check", + c->GetName(), + current_task->task_id, + activity_id, + activity_type, + npc_type_id + ); continue; } - // We found an active task to kill this type of NPC, so increment the done count - Log(Logs::General, Logs::Tasks, "[UPDATE] Calling increment done count ByNPC"); - IncrementDoneCount(c, Task, cur_task->slot, j); - Ret = true; + // Is the activity_information to kill this type of NPC ? + switch (p_task_information->activity_information[activity_id].GoalMethod) { + case METHODSINGLEID: + if (p_task_information->activity_information[activity_id].GoalID != npc_type_id) { + continue; + } + break; + + case METHODLIST: + if (!p_task_manager->GoalListManager.IsInList(p_task_information->activity_information[activity_id].GoalID, npc_type_id)) { + continue; + } + break; + + default: + // If METHODQUEST, don't updated the activity_information here + continue; + } + // We found an active p_task_information to kill this type of NPC, so increment the done count + LogTasksDetail("Calling increment done count ByNPC"); + IncrementDoneCount(c, p_task_information, current_task->slot, activity_id); + is_updating = true; } } - return Ret; + return is_updating; } -int ClientTaskState::ActiveSpeakTask(int NPCTypeID) { +int ClientTaskState::ActiveSpeakTask(int npc_type_id) +{ - // This method is to be used from Perl quests only and returns the TaskID of the first - // active task found which has an active SpeakWith activity for this NPC. - - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... + // This method is to be used from Perl quests only and returns the task_id of the first + // active task found which has an active SpeakWith activity_information for this NPC. + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return 0; + } // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) + for (auto & active_task : ActiveTasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { continue; + } - TaskInformation* Task = taskmanager->Tasks[cur_task->TaskID]; - - if (Task == nullptr) + TaskInformation *p_task_information = p_task_manager->Tasks[current_task->task_id]; + if (p_task_information == nullptr) { continue; + } - for (int j = 0; j < Task->ActivityCount; j++) { + for (int activity_id = 0; activity_id < p_task_information->activity_count; activity_id++) { // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) + if (current_task->activity[activity_id].activity_state != ActivityActive) { continue; - if (Task->Activity[j].Type != ActivitySpeakWith) + } + if (p_task_information->activity_information[activity_id].Type != ActivitySpeakWith) { continue; - // Is there a zone restriction on the activity ? - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) + } + // Is there a zone restriction on the activity_information ? + if (!p_task_information->activity_information[activity_id].CheckZone(zone->GetZoneID())) { continue; - // Is the activity to speak with this type of NPC ? - if (Task->Activity[j].GoalMethod == METHODQUEST && Task->Activity[j].GoalID == NPCTypeID) - return cur_task->TaskID; + } + // Is the activity_information to speak with this type of NPC ? + if (p_task_information->activity_information[activity_id].GoalMethod == METHODQUEST && p_task_information->activity_information[activity_id].GoalID == npc_type_id) { + return current_task->task_id; + } } } return 0; } -int ClientTaskState::ActiveSpeakActivity(int NPCTypeID, int TaskID) { +int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) +{ - // This method is to be used from Perl quests only and returns the ActivityID of the first - // active activity found in the specified task which is to SpeakWith this NPC. - - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... + // This method is to be used from Perl quests only and returns the activity_id of the first + // active activity_information found in the specified task which is to SpeakWith this NPC. + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return -1; - if (TaskID <= 0 || TaskID >= MAXTASKS) + } + if (task_id <= 0 || task_id >= MAXTASKS) { return -1; + } // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID != TaskID) + for (auto & ActiveTask : ActiveTasks) { + auto current_task = &ActiveTask; + if (current_task->task_id != task_id) { continue; + } - TaskInformation* Task = taskmanager->Tasks[cur_task->TaskID]; - - if (Task == nullptr) + TaskInformation *p_task_information = p_task_manager->Tasks[current_task->task_id]; + if (p_task_information == nullptr) { continue; + } - for (int j = 0; j < Task->ActivityCount; j++) { + for (int activity_index = 0; activity_index < p_task_information->activity_count; activity_index++) { // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) + if (current_task->activity[activity_index].activity_state != ActivityActive) { continue; - if (Task->Activity[j].Type != ActivitySpeakWith) + } + if (p_task_information->activity_information[activity_index].Type != ActivitySpeakWith) { continue; - // Is there a zone restriction on the activity ? - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) + } + // Is there a zone restriction on the activity_information ? + if (!p_task_information->activity_information[activity_index].CheckZone(zone->GetZoneID())) { continue; - // Is the activity to speak with this type of NPC ? - if (Task->Activity[j].GoalMethod == METHODQUEST && Task->Activity[j].GoalID == NPCTypeID) - return j; + } + // Is the activity_information to speak with this type of NPC ? + if (p_task_information->activity_information[activity_index].GoalMethod == METHODQUEST && + p_task_information->activity_information[activity_index].GoalID == npc_type_id) { + return activity_index; + } } return 0; } return 0; } -void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemID, int Count) { +void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemID, int Count) +{ // This method updates the client's task activities of the specified type which relate // to the specified item. @@ -1666,49 +1848,54 @@ void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemI Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksForItem(%d,%d)", Type, ItemID); - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; + } // loop over the union of tasks and quests for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) + if (cur_task->task_id == TASKSLOTEMPTY) { continue; + } // Check if there are any active loot activities for this task - TaskInformation* Task = taskmanager->Tasks[cur_task->TaskID]; + TaskInformation *Task = p_task_manager->Tasks[cur_task->task_id]; - if (Task == nullptr) + if (Task == nullptr) { return; + } - for (int j = 0; j < Task->ActivityCount; j++) { + for (int j = 0; j < Task->activity_count; j++) { // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) - continue; - // We are only interested in the ActivityType we were called with - if (Task->Activity[j].Type != (int)Type) - continue; - // Is there a zone restriction on the activity ? - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Activity type %i for Item %i failed zone check", - c->GetName(), Type, ItemID); + if (cur_task->activity[j].activity_state != ActivityActive) { continue; } - // Is the activity related to this item ? + // We are only interested in the ActivityType we were called with + if (Task->activity_information[j].Type != (int) Type) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!Task->activity_information[j].CheckZone(zone->GetZoneID())) { + Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s activity_information type %i for Item %i failed zone check", + c->GetName(), Type, ItemID); + continue; + } + // Is the activity_information related to this item ? // - switch(Task->Activity[j].GoalMethod) { + switch (Task->activity_information[j].GoalMethod) { case METHODSINGLEID: - if(Task->Activity[j].GoalID != ItemID) continue; + if (Task->activity_information[j].GoalID != ItemID) { continue; } break; case METHODLIST: - if(!taskmanager->GoalListManager.IsInList(Task->Activity[j].GoalID, ItemID)) continue; + if (!p_task_manager->GoalListManager.IsInList(Task->activity_information[j].GoalID, ItemID)) { continue; } break; default: - // If METHODQUEST, don't update the activity here + // If METHODQUEST, don't updated the activity_information here continue; } // We found an active task related to this item, so increment the done count @@ -1726,57 +1913,66 @@ void ClientTaskState::UpdateTasksOnExplore(Client *c, int ExploreID) // If the client has no tasks, there is nothing further to check. Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksOnExplore(%i)", ExploreID); - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; + } // loop over the union of tasks and quests for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) + if (cur_task->task_id == TASKSLOTEMPTY) { continue; + } // Check if there are any active explore activities for this task - TaskInformation *Task = taskmanager->Tasks[cur_task->TaskID]; + TaskInformation *Task = p_task_manager->Tasks[cur_task->task_id]; - if (Task == nullptr) + if (Task == nullptr) { return; + } - for (int j = 0; j < Task->ActivityCount; j++) { + for (int j = 0; j < Task->activity_count; j++) { // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) - continue; - // We are only interested in explore activities - if (Task->Activity[j].Type != ActivityExplore) - continue; - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] Char: %s Explore exploreid %i failed zone check", c->GetName(), - ExploreID); + if (cur_task->activity[j].activity_state != ActivityActive) { continue; } - // Is the activity to explore this area id ? - switch (Task->Activity[j].GoalMethod) { - - case METHODSINGLEID: - if (Task->Activity[j].GoalID != ExploreID) - continue; - break; - - case METHODLIST: - if (!taskmanager->GoalListManager.IsInList(Task->Activity[j].GoalID, ExploreID)) - continue; - break; - - default: - // If METHODQUEST, don't update the activity here + // We are only interested in explore activities + if (Task->activity_information[j].Type != ActivityExplore) { continue; } + if (!Task->activity_information[j].CheckZone(zone->GetZoneID())) { + Log(Logs::General, Logs::Tasks, + "[UPDATE] Char: %s Explore exploreid %i failed zone check", c->GetName(), + ExploreID); + continue; + } + // Is the activity_information to explore this area id ? + switch (Task->activity_information[j].GoalMethod) { + + case METHODSINGLEID: + if (Task->activity_information[j].GoalID != ExploreID) { + continue; + } + break; + + case METHODLIST: + if (!p_task_manager->GoalListManager.IsInList(Task->activity_information[j].GoalID, ExploreID)) { + continue; + } + break; + + default: + // If METHODQUEST, don't updated the activity_information here + continue; + } // We found an active task to explore this area, so set done count to goal count // (Only a goal count of 1 makes sense for explore activities?) Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on explore"); - IncrementDoneCount(c, Task, cur_task->slot, j, - Task->Activity[j].GoalCount - cur_task->Activity[j].DoneCount); + IncrementDoneCount( + c, Task, cur_task->slot, j, + Task->activity_information[j].GoalCount - cur_task->activity[j].done_count + ); } } @@ -1789,64 +1985,74 @@ bool ClientTaskState::UpdateTasksOnDeliver(Client *c, std::listTaskID == TASKSLOTEMPTY) + if (cur_task->task_id == TASKSLOTEMPTY) { continue; + } // Check if there are any active deliver activities for this task - TaskInformation *Task = taskmanager->Tasks[cur_task->TaskID]; + TaskInformation *Task = p_task_manager->Tasks[cur_task->task_id]; - if (Task == nullptr) + if (Task == nullptr) { return false; + } - for (int j = 0; j < Task->ActivityCount; j++) { + for (int j = 0; j < Task->activity_count; j++) { // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) - continue; - // We are only interested in Deliver activities - if (Task->Activity[j].Type != ActivityDeliver && Task->Activity[j].Type != ActivityGiveCash) - continue; - // Is there a zone restriction on the activity ? - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] Char: %s Deliver activity failed zone check (current zone %i, need zone " - "%s", - c->GetName(), zone->GetZoneID(), Task->Activity[j].zones.c_str()); + if (cur_task->activity[j].activity_state != ActivityActive) { continue; } - // Is the activity to deliver to this NPCTypeID ? - if (Task->Activity[j].DeliverToNPC != NPCTypeID) + // We are only interested in Deliver activities + if (Task->activity_information[j].Type != ActivityDeliver && Task->activity_information[j].Type != ActivityGiveCash) { continue; - // Is the activity related to these items ? + } + // Is there a zone restriction on the activity_information ? + if (!Task->activity_information[j].CheckZone(zone->GetZoneID())) { + Log(Logs::General, Logs::Tasks, + "[UPDATE] Char: %s Deliver activity_information failed zone check (current zone %i, need zone " + "%s", + c->GetName(), zone->GetZoneID(), Task->activity_information[j].zones.c_str()); + continue; + } + // Is the activity_information to deliver to this NPCTypeID ? + if (Task->activity_information[j].DeliverToNPC != NPCTypeID) { + continue; + } + // Is the activity_information related to these items ? // - if ((Task->Activity[j].Type == ActivityGiveCash) && Cash) { + if ((Task->activity_information[j].Type == ActivityGiveCash) && Cash) { Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on GiveCash"); IncrementDoneCount(c, Task, i, j, Cash); Ret = true; - } else { + } + else { for (auto &k : Items) { - switch (Task->Activity[j].GoalMethod) { + switch (Task->activity_information[j].GoalMethod) { - case METHODSINGLEID: - if (Task->Activity[j].GoalID != k->GetID()) + case METHODSINGLEID: + if (Task->activity_information[j].GoalID != k->GetID()) { + continue; + } + break; + + case METHODLIST: + if (!p_task_manager->GoalListManager.IsInList( + Task->activity_information[j].GoalID, + k->GetID())) { + continue; + } + break; + + default: + // If METHODQUEST, don't updated the activity_information here continue; - break; - - case METHODLIST: - if (!taskmanager->GoalListManager.IsInList(Task->Activity[j].GoalID, - k->GetID())) - continue; - break; - - default: - // If METHODQUEST, don't update the activity here - continue; } // We found an active task related to this item, so increment the done count Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on GiveItem"); @@ -1865,99 +2071,124 @@ void ClientTaskState::UpdateTasksOnTouch(Client *c, int ZoneID) // If the client has no tasks, there is nothing further to check. Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksOnTouch(%i)", ZoneID); - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; + } // loop over the union of tasks and quests for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) + if (cur_task->task_id == TASKSLOTEMPTY) { continue; + } // Check if there are any active explore activities for this task - TaskInformation *Task = taskmanager->Tasks[cur_task->TaskID]; + TaskInformation *Task = p_task_manager->Tasks[cur_task->task_id]; - if (Task == nullptr) + if (Task == nullptr) { return; + } - for (int j = 0; j < Task->ActivityCount; j++) { + for (int j = 0; j < Task->activity_count; j++) { // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) + if (cur_task->activity[j].activity_state != ActivityActive) { continue; + } // We are only interested in touch activities - if (Task->Activity[j].Type != ActivityTouch) + if (Task->activity_information[j].Type != ActivityTouch) { continue; - if (Task->Activity[j].GoalMethod != METHODSINGLEID) + } + if (Task->activity_information[j].GoalMethod != METHODSINGLEID) { continue; - if (!Task->Activity[j].CheckZone(ZoneID)) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Touch activity failed zone check", - c->GetName()); + } + if (!Task->activity_information[j].CheckZone(ZoneID)) { + Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Touch activity_information failed zone check", + c->GetName()); continue; } // We found an active task to zone into this zone, so set done count to goal count // (Only a goal count of 1 makes sense for touch activities?) Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on Touch"); - IncrementDoneCount(c, Task, cur_task->slot, j, - Task->Activity[j].GoalCount - cur_task->Activity[j].DoneCount); + IncrementDoneCount( + c, Task, cur_task->slot, j, + Task->activity_information[j].GoalCount - cur_task->activity[j].done_count + ); } } return; } -void ClientTaskState::IncrementDoneCount(Client *c, TaskInformation *Task, int TaskIndex, int ActivityID, int Count, - bool ignore_quest_update) +void ClientTaskState::IncrementDoneCount( + Client *c, TaskInformation *Task, int TaskIndex, int ActivityID, int Count, + bool ignore_quest_update +) { Log(Logs::General, Logs::Tasks, "[UPDATE] IncrementDoneCount"); auto info = GetClientTaskInfo(Task->type, TaskIndex); - if (info == nullptr) + if (info == nullptr) { return; + } - info->Activity[ActivityID].DoneCount += Count; + info->activity[ActivityID].done_count += Count; - if(info->Activity[ActivityID].DoneCount > Task->Activity[ActivityID].GoalCount) - info->Activity[ActivityID].DoneCount = Task->Activity[ActivityID].GoalCount; + if (info->activity[ActivityID].done_count > Task->activity_information[ActivityID].GoalCount) { + info->activity[ActivityID].done_count = Task->activity_information[ActivityID].GoalCount; + } - if (!ignore_quest_update){ + if (!ignore_quest_update) { char buf[24]; - snprintf(buf, 23, "%d %d %d", info->Activity[ActivityID].DoneCount, info->Activity[ActivityID].ActivityID, info->TaskID); + snprintf( + buf, + 23, + "%d %d %d", + info->activity[ActivityID].done_count, + info->activity[ActivityID].activity_id, + info->task_id + ); buf[23] = '\0'; parse->EventPlayer(EVENT_TASK_UPDATE, c, buf, 0); } - info->Activity[ActivityID].Updated=true; - // Have we reached the goal count for this activity ? - if(info->Activity[ActivityID].DoneCount >= Task->Activity[ActivityID].GoalCount) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Done (%i) = Goal (%i) for Activity %i", - info->Activity[ActivityID].DoneCount, - Task->Activity[ActivityID].GoalCount, - ActivityID); + info->activity[ActivityID].updated = true; + // Have we reached the goal count for this activity_information ? + if (info->activity[ActivityID].done_count >= Task->activity_information[ActivityID].GoalCount) { + Log(Logs::General, Logs::Tasks, "[UPDATE] Done (%i) = Goal (%i) for activity_information %i", + info->activity[ActivityID].done_count, + Task->activity_information[ActivityID].GoalCount, + ActivityID); - // Flag the activity as complete - info->Activity[ActivityID].State = ActivityCompleted; + // Flag the activity_information as complete + info->activity[ActivityID].activity_state = ActivityCompleted; // Unlock subsequent activities for this task bool TaskComplete = UnlockActivities(c->CharacterID(), *info); Log(Logs::General, Logs::Tasks, "[UPDATE] TaskCompleted is %i", TaskComplete); // and by the 'Task Stage Completed' message - c->SendTaskActivityComplete(info->TaskID, ActivityID, TaskIndex, Task->type); - // Send the updated task/activity list to the client - taskmanager->SendSingleActiveTaskToClient(c, *info, TaskComplete, false); + c->SendTaskActivityComplete(info->task_id, ActivityID, TaskIndex, Task->type); + // Send the updated task/activity_information list to the client + p_task_manager->SendSingleActiveTaskToClient(c, *info, TaskComplete, false); // Inform the client the task has been updated, both by a chat message - c->Message(Chat::White, "Your task '%s' has been updated.", Task->Title.c_str()); + c->Message(Chat::White, "Your task '%s' has been updated.", Task->title.c_str()); - if(Task->Activity[ActivityID].GoalMethod != METHODQUEST) { - if (!ignore_quest_update){ + if (Task->activity_information[ActivityID].GoalMethod != METHODQUEST) { + if (!ignore_quest_update) { char buf[24]; - snprintf(buf, 23, "%d %d", info->TaskID, info->Activity[ActivityID].ActivityID); + snprintf(buf, 23, "%d %d", info->task_id, info->activity[ActivityID].activity_id); buf[23] = '\0'; parse->EventPlayer(EVENT_TASK_STAGE_COMPLETE, c, buf, 0); } /* QS: PlayerLogTaskUpdates :: Update */ - if (RuleB(QueryServ, PlayerLogTaskUpdates)){ - std::string event_desc = StringFormat("Task Stage Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", info->TaskID, info->Activity[ActivityID].ActivityID, info->Activity[ActivityID].DoneCount, c->GetZoneID(), c->GetInstanceID()); + if (RuleB(QueryServ, PlayerLogTaskUpdates)) { + std::string event_desc = StringFormat( + "Task Stage Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", + info->task_id, + info->activity[ActivityID].activity_id, + info->activity[ActivityID].done_count, + c->GetZoneID(), + c->GetInstanceID()); QServ->PlayerLogEvent(Player_Log_Task_Updates, c->CharacterID(), event_desc); } } @@ -1965,144 +2196,164 @@ void ClientTaskState::IncrementDoneCount(Client *c, TaskInformation *Task, int T // If this task is now complete, the Completed tasks will have been // updated in UnlockActivities. Send the completed task list to the // client. This is the same sequence the packets are sent on live. - if(TaskComplete) { + if (TaskComplete) { char buf[24]; - snprintf(buf, 23, "%d %d %d", info->Activity[ActivityID].DoneCount, info->Activity[ActivityID].ActivityID, info->TaskID); + snprintf( + buf, + 23, + "%d %d %d", + info->activity[ActivityID].done_count, + info->activity[ActivityID].activity_id, + info->task_id + ); buf[23] = '\0'; parse->EventPlayer(EVENT_TASK_COMPLETE, c, buf, 0); /* QS: PlayerLogTaskUpdates :: Complete */ - if (RuleB(QueryServ, PlayerLogTaskUpdates)){ - std::string event_desc = StringFormat("Task Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", info->TaskID, info->Activity[ActivityID].ActivityID, info->Activity[ActivityID].DoneCount, c->GetZoneID(), c->GetInstanceID()); + if (RuleB(QueryServ, PlayerLogTaskUpdates)) { + std::string event_desc = StringFormat( + "Task Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", + info->task_id, + info->activity[ActivityID].activity_id, + info->activity[ActivityID].done_count, + c->GetZoneID(), + c->GetInstanceID()); QServ->PlayerLogEvent(Player_Log_Task_Updates, c->CharacterID(), event_desc); } - taskmanager->SendCompletedTasksToClient(c, this); - c->SendTaskActivityComplete(info->TaskID, 0, TaskIndex, Task->type, 0); - taskmanager->SaveClientState(c, this); + p_task_manager->SendCompletedTasksToClient(c, this); + c->SendTaskActivityComplete(info->task_id, 0, TaskIndex, Task->type, 0); + p_task_manager->SaveClientState(c, this); //c->SendTaskComplete(TaskIndex); c->CancelTask(TaskIndex, Task->type); - //if(Task->RewardMethod != METHODQUEST) RewardTask(c, Task); - // If Experience and/or cash rewards are set, reward them from the task even if RewardMethod is METHODQUEST + //if(Task->reward_method != METHODQUEST) RewardTask(c, Task); + // If Experience and/or cash rewards are set, reward them from the task even if reward_method is METHODQUEST RewardTask(c, Task); //RemoveTask(c, TaskIndex); } - } else { - // Send an update packet for this single activity - taskmanager->SendTaskActivityLong(c, info->TaskID, ActivityID, TaskIndex, - Task->Activity[ActivityID].Optional); - taskmanager->SaveClientState(c, this); + } + else { + // Send an updated packet for this single activity_information + p_task_manager->SendTaskActivityLong( + c, info->task_id, ActivityID, TaskIndex, + Task->activity_information[ActivityID].Optional + ); + p_task_manager->SaveClientState(c, this); } } -void ClientTaskState::RewardTask(Client *c, TaskInformation *Task) { +void ClientTaskState::RewardTask(Client *c, TaskInformation *Task) +{ - if(!Task || !c) return; + if (!Task || !c) { return; } - const EQ::ItemData* Item; - std::vector RewardList; + const EQ::ItemData *Item; + std::vector RewardList; - switch(Task->RewardMethod) { + switch (Task->reward_method) { - case METHODSINGLEID: - { - if(Task->RewardID) { - c->SummonItem(Task->RewardID); - Item = database.GetItem(Task->RewardID); - if(Item) + case METHODSINGLEID: { + if (Task->reward_id) { + c->SummonItem(Task->reward_id); + Item = database.GetItem(Task->reward_id); + if (Item) { c->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); + } } break; } - case METHODLIST: - { - RewardList = taskmanager->GoalListManager.GetListContents(Task->RewardID); - for(unsigned int i=0; iGoalListManager.GetListContents(Task->reward_id); + for (unsigned int i = 0; i < RewardList.size(); i++) { c->SummonItem(RewardList[i]); Item = database.GetItem(RewardList[i]); - if(Item) + if (Item) { c->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); + } } break; } - default: - { + default: { // Nothing special done for METHODQUEST break; } } - if (!Task->completion_emote.empty()) - c->SendColoredText(Chat::Yellow, Task->completion_emote); // unsure if they use this packet or color, should work + if (!Task->completion_emote.empty()) { + c->SendColoredText( + Chat::Yellow, + Task->completion_emote + ); + } // unsure if they use this packet or color, should work // just use normal NPC faction ID stuff if (Task->faction_reward) c->SetFactionLevel(c->CharacterID(), Task->faction_reward, c->GetBaseClass(), c->GetBaseRace(), c->GetDeity()); - if(Task->CashReward) { + if (Task->cash_reward) { int Plat, Gold, Silver, Copper; - Copper = Task->CashReward; + Copper = Task->cash_reward; c->AddMoneyToPP(Copper, true); - Plat = Copper / 1000; + Plat = Copper / 1000; Copper = Copper - (Plat * 1000); - Gold = Copper / 100; + Gold = Copper / 100; Copper = Copper - (Gold * 100); Silver = Copper / 10; Copper = Copper - (Silver * 10); std::string CashMessage; - if (Plat>0){ + if (Plat > 0) { CashMessage = "You receive "; CashMessage += itoa(Plat); CashMessage += " platinum"; } - if (Gold>0){ - if (CashMessage.length()==0){ + if (Gold > 0) { + if (CashMessage.length() == 0) { CashMessage = "You receive "; } - else{ + else { CashMessage += ","; } CashMessage += itoa(Gold); CashMessage += " gold"; } - if(Silver>0){ - if (CashMessage.length()==0){ + if (Silver > 0) { + if (CashMessage.length() == 0) { CashMessage = "You receive "; } - else{ + else { CashMessage += ","; } CashMessage += itoa(Silver); CashMessage += " silver"; } - if(Copper>0){ - if (CashMessage.length()==0){ + if (Copper > 0) { + if (CashMessage.length() == 0) { CashMessage = "You receive "; } - else{ + else { CashMessage += ","; } CashMessage += itoa(Copper); CashMessage += " copper"; } CashMessage += " pieces."; - c->Message(Chat::Yellow,CashMessage.c_str()); + c->Message(Chat::Yellow, CashMessage.c_str()); } - int32 EXPReward = Task->XPReward; - if(EXPReward > 0) { + int32 EXPReward = Task->experience_reward; + if (EXPReward > 0) { c->AddEXP(EXPReward); } - if(EXPReward < 0) { + if (EXPReward < 0) { uint32 PosReward = EXPReward * -1; - // Minimal Level Based Exp Reward Setting is 101 (1% exp at level 1) + // Minimal Level Based Exp reward Setting is 101 (1% exp at level 1) if (PosReward > 100 && PosReward < 25700) { - uint8 MaxLevel = PosReward / 100; + uint8 MaxLevel = PosReward / 100; uint8 ExpPercent = PosReward - (MaxLevel * 100); c->AddLevelBasedExp(ExpPercent, MaxLevel); } @@ -2113,15 +2364,18 @@ void ClientTaskState::RewardTask(Client *c, TaskInformation *Task) { bool ClientTaskState::IsTaskActive(int TaskID) { - if (ActiveTask.TaskID == TaskID) + if (active_task.task_id == TaskID) { return true; + } - if (ActiveTaskCount == 0 || TaskID == 0) + if (active_task_count == 0 || TaskID == 0) { return false; + } for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) + if (active_quests[i].task_id == TaskID) { return true; + } } return false; @@ -2129,9 +2383,9 @@ bool ClientTaskState::IsTaskActive(int TaskID) void ClientTaskState::FailTask(Client *c, int TaskID) { - Log(Logs::General, Logs::Tasks, "[UPDATE] FailTask %i, ActiveTaskCount is %i", TaskID, ActiveTaskCount); + Log(Logs::General, Logs::Tasks, "[UPDATE] FailTask %i, ActiveTaskCount is %i", TaskID, active_task_count); - if (ActiveTask.TaskID == TaskID) { + if (active_task.task_id == TaskID) { c->SendTaskFailed(TaskID, 0, TaskType::Task); // Remove the task from the client c->CancelTask(0, TaskType::Task); @@ -2140,12 +2394,13 @@ void ClientTaskState::FailTask(Client *c, int TaskID) // TODO: shared tasks - if (ActiveTaskCount == 0) + if (active_task_count == 0) { return; + } for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) { - c->SendTaskFailed(ActiveQuests[i].TaskID, i, TaskType::Quest); + if (active_quests[i].task_id == TaskID) { + c->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); // Remove the task from the client c->CancelTask(i, TaskType::Quest); return; @@ -2159,101 +2414,120 @@ bool ClientTaskState::IsTaskActivityActive(int TaskID, int ActivityID) Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i).", TaskID, ActivityID); // Quick sanity check - if (ActivityID < 0) + if (ActivityID < 0) { return false; - if (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY) + } + if (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY) { return false; + } - int ActiveTaskIndex = -1; - auto type = TaskType::Task; + int ActiveTaskIndex = -1; + auto type = TaskType::Task; - if (ActiveTask.TaskID == TaskID) + if (active_task.task_id == TaskID) { ActiveTaskIndex = 0; + } if (ActiveTaskIndex == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) { + if (active_quests[i].task_id == TaskID) { ActiveTaskIndex = i; - type = TaskType::Quest; + type = TaskType::Quest; break; } } } // The client does not have this task - if (ActiveTaskIndex == -1) + if (ActiveTaskIndex == -1) { return false; + } auto info = GetClientTaskInfo(type, ActiveTaskIndex); - if (info == nullptr) + if (info == nullptr) { return false; + } - TaskInformation *Task = taskmanager->Tasks[info->TaskID]; + TaskInformation *Task = p_task_manager->Tasks[info->task_id]; // The task is invalid - if (Task == nullptr) + if (Task == nullptr) { return false; + } - // The ActivityID is out of range - if (ActivityID >= Task->ActivityCount) + // The activity_id is out of range + if (ActivityID >= Task->activity_count) { return false; + } - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i). State is %i ", TaskID, - ActivityID, info->Activity[ActivityID].State); + Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i). activity_state is %i ", TaskID, + ActivityID, info->activity[ActivityID].activity_state); - return (info->Activity[ActivityID].State == ActivityActive); + return (info->activity[ActivityID].activity_state == ActivityActive); } -void ClientTaskState::UpdateTaskActivity(Client *c, int TaskID, int ActivityID, int Count, bool ignore_quest_update /*= false*/) +void ClientTaskState::UpdateTaskActivity( + Client *c, + int TaskID, + int ActivityID, + int Count, + bool ignore_quest_update /*= false*/) { Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState UpdateTaskActivity(%i, %i, %i).", TaskID, ActivityID, - Count); + Count); // Quick sanity check - if (ActivityID < 0 || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) + if (ActivityID < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { return; + } - int ActiveTaskIndex = -1; - auto type = TaskType::Task; + int ActiveTaskIndex = -1; + auto type = TaskType::Task; - if (ActiveTask.TaskID == TaskID) + if (active_task.task_id == TaskID) { ActiveTaskIndex = 0; + } if (ActiveTaskIndex == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) { + if (active_quests[i].task_id == TaskID) { ActiveTaskIndex = i; - type = TaskType::Quest; + type = TaskType::Quest; break; } } } // The client does not have this task - if (ActiveTaskIndex == -1) + if (ActiveTaskIndex == -1) { return; + } auto info = GetClientTaskInfo(type, ActiveTaskIndex); - if (info == nullptr) + if (info == nullptr) { return; + } - TaskInformation *Task = taskmanager->Tasks[info->TaskID]; + TaskInformation *Task = p_task_manager->Tasks[info->task_id]; // The task is invalid - if (Task == nullptr) + if (Task == nullptr) { return; + } - // The ActivityID is out of range - if (ActivityID >= Task->ActivityCount) + // The activity_id is out of range + if (ActivityID >= Task->activity_count) { return; + } - // The Activity is not currently active - if (info->Activity[ActivityID].State == ActivityHidden) + // The activity_information is not currently active + if (info->activity[ActivityID].activity_state == ActivityHidden) { return; - + } + Log(Logs::General, Logs::Tasks, "[UPDATE] Increment done count on UpdateTaskActivity %d %d", ActivityID, Count); IncrementDoneCount(c, Task, ActiveTaskIndex, ActivityID, Count, ignore_quest_update); } @@ -2263,76 +2537,92 @@ void ClientTaskState::ResetTaskActivity(Client *c, int TaskID, int ActivityID) Log(Logs::General, Logs::Tasks, "[RESET] ClientTaskState ResetTaskActivity(%i, %i).", TaskID, ActivityID); // Quick sanity check - if (ActivityID < 0 || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) + if (ActivityID < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { return; + } - int ActiveTaskIndex = -1; - auto type = TaskType::Task; + int ActiveTaskIndex = -1; + auto type = TaskType::Task; - if (ActiveTask.TaskID == TaskID) + if (active_task.task_id == TaskID) { ActiveTaskIndex = 0; + } if (ActiveTaskIndex == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) { + if (active_quests[i].task_id == TaskID) { ActiveTaskIndex = i; - type = TaskType::Quest; + type = TaskType::Quest; break; } } } // The client does not have this task - if (ActiveTaskIndex == -1) + if (ActiveTaskIndex == -1) { return; + } auto info = GetClientTaskInfo(type, ActiveTaskIndex); - if (info == nullptr) + if (info == nullptr) { return; + } - TaskInformation *Task = taskmanager->Tasks[info->TaskID]; + TaskInformation *Task = p_task_manager->Tasks[info->task_id]; // The task is invalid - if (Task == nullptr) + if (Task == nullptr) { return; + } - // The ActivityID is out of range - if (ActivityID >= Task->ActivityCount) + // The activity_id is out of range + if (ActivityID >= Task->activity_count) { return; + } - // The Activity is not currently active - if (info->Activity[ActivityID].State == ActivityHidden) + // The activity_information is not currently active + if (info->activity[ActivityID].activity_state == ActivityHidden) { return; - + } + Log(Logs::General, Logs::Tasks, "[RESET] Increment done count on ResetTaskActivity"); - IncrementDoneCount(c, Task, ActiveTaskIndex, ActivityID, (info->Activity[ActivityID].DoneCount * -1), false); + IncrementDoneCount(c, Task, ActiveTaskIndex, ActivityID, (info->activity[ActivityID].done_count * -1), false); } void ClientTaskState::ShowClientTasks(Client *c) { c->Message(Chat::White, "Task Information:"); - if (ActiveTask.TaskID != TASKSLOTEMPTY) { - c->Message(Chat::White, "Task: %i %s", ActiveTask.TaskID, taskmanager->Tasks[ActiveTask.TaskID]->Title.c_str()); - c->Message(Chat::White, " Description: [%s]\n", taskmanager->Tasks[ActiveTask.TaskID]->Description.c_str()); - for (int j = 0; j < taskmanager->GetActivityCount(ActiveTask.TaskID); j++) { - c->Message(Chat::White, " Activity: %2d, DoneCount: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - ActiveTask.Activity[j].ActivityID, ActiveTask.Activity[j].DoneCount, - ActiveTask.Activity[j].State); + if (active_task.task_id != TASKSLOTEMPTY) { + c->Message(Chat::White, "Task: %i %s", active_task.task_id, p_task_manager->Tasks[active_task.task_id]->title.c_str()); + c->Message(Chat::White, " description: [%s]\n", p_task_manager->Tasks[active_task.task_id]->description.c_str()); + for (int j = 0; j < p_task_manager->GetActivityCount(active_task.task_id); j++) { + c->Message( + Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", + active_task.activity[j].activity_id, active_task.activity[j].done_count, + active_task.activity[j].activity_state + ); } } for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TASKSLOTEMPTY) + if (active_quests[i].task_id == TASKSLOTEMPTY) { continue; + } - c->Message(Chat::White, "Quest: %i %s", ActiveQuests[i].TaskID, - taskmanager->Tasks[ActiveQuests[i].TaskID]->Title.c_str()); - c->Message(Chat::White, " Description: [%s]\n", taskmanager->Tasks[ActiveQuests[i].TaskID]->Description.c_str()); - for (int j = 0; j < taskmanager->GetActivityCount(ActiveQuests[i].TaskID); j++) { - c->Message(Chat::White, " Activity: %2d, DoneCount: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - ActiveQuests[i].Activity[j].ActivityID, ActiveQuests[i].Activity[j].DoneCount, - ActiveQuests[i].Activity[j].State); + c->Message( + Chat::White, "Quest: %i %s", active_quests[i].task_id, + p_task_manager->Tasks[active_quests[i].task_id]->title.c_str()); + c->Message( + Chat::White, + " description: [%s]\n", + p_task_manager->Tasks[active_quests[i].task_id]->description.c_str()); + for (int j = 0; j < p_task_manager->GetActivityCount(active_quests[i].task_id); j++) { + c->Message( + Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", + active_quests[i].activity[j].activity_id, active_quests[i].activity[j].done_count, + active_quests[i].activity[j].activity_state + ); } } } @@ -2340,41 +2630,47 @@ void ClientTaskState::ShowClientTasks(Client *c) // TODO: Shared Task int ClientTaskState::TaskTimeLeft(int TaskID) { - if (ActiveTask.TaskID == TaskID) { + if (active_task.task_id == TaskID) { int Now = time(nullptr); - TaskInformation *Task = taskmanager->Tasks[TaskID]; + TaskInformation *Task = p_task_manager->Tasks[TaskID]; - if (Task == nullptr) + if (Task == nullptr) { return -1; + } - if (!Task->Duration) + if (!Task->duration) { return -1; + } - int TimeLeft = (ActiveTask.AcceptedTime + Task->Duration - Now); + int TimeLeft = (active_task.accepted_time + Task->duration - Now); return (TimeLeft > 0 ? TimeLeft : 0); } - if (ActiveTaskCount == 0) + if (active_task_count == 0) { return -1; + } for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID != TaskID) + if (active_quests[i].task_id != TaskID) { continue; + } int Now = time(nullptr); - TaskInformation *Task = taskmanager->Tasks[ActiveQuests[i].TaskID]; + TaskInformation *Task = p_task_manager->Tasks[active_quests[i].task_id]; - if (Task == nullptr) + if (Task == nullptr) { return -1; + } - if (!Task->Duration) + if (!Task->duration) { return -1; + } - int TimeLeft = (ActiveQuests[i].AcceptedTime + Task->Duration - Now); + int TimeLeft = (active_quests[i].accepted_time + Task->duration - Now); // If Timeleft is negative, return 0, else return the number of seconds left @@ -2384,31 +2680,37 @@ int ClientTaskState::TaskTimeLeft(int TaskID) return -1; } -int ClientTaskState::IsTaskCompleted(int TaskID) { +int ClientTaskState::IsTaskCompleted(int TaskID) +{ // Returns: -1 if RecordCompletedTasks is not true // +1 if the task has been completed // 0 if the task has not been completed - if(!(RuleB(TaskSystem, RecordCompletedTasks))) return -1; + if (!(RuleB(TaskSystem, RecordCompletedTasks))) { return -1; } - for(unsigned int i=0; i= MAXTASKS)) return false; + if ((TaskID <= 0) || (TaskID >= MAXTASKS)) { return false; } - TaskInformation* Task = taskmanager->Tasks[TaskID]; + TaskInformation *Task = p_task_manager->Tasks[TaskID]; - if(Task == nullptr) return false; + if (Task == nullptr) { return false; } - return Task->Repeatable; + return Task->repeatable; } bool ClientTaskState::TaskOutOfTime(TaskType type, int Index) @@ -2416,29 +2718,32 @@ bool ClientTaskState::TaskOutOfTime(TaskType type, int Index) // Returns true if the Task in the specified slot has a time limit that has been exceeded. auto info = GetClientTaskInfo(type, Index); - if (info == nullptr) + if (info == nullptr) { return false; + } - // make sure the TaskID is at least maybe in our array - if (info->TaskID <= 0 || info->TaskID >= MAXTASKS) + // make sure the task_id is at least maybe in our array + if (info->task_id <= 0 || info->task_id >= MAXTASKS) { return false; + } int Now = time(nullptr); - TaskInformation *Task = taskmanager->Tasks[info->TaskID]; + TaskInformation *Task = p_task_manager->Tasks[info->task_id]; - if (Task == nullptr) + if (Task == nullptr) { return false; + } - return (Task->Duration && (info->AcceptedTime + Task->Duration <= Now)); + return (Task->duration && (info->accepted_time + Task->duration <= Now)); } void ClientTaskState::TaskPeriodicChecks(Client *c) { - if (ActiveTask.TaskID != TASKSLOTEMPTY) { + if (active_task.task_id != TASKSLOTEMPTY) { if (TaskOutOfTime(TaskType::Task, 0)) { // Send Red Task Failed Message - c->SendTaskFailed(ActiveTask.TaskID, 0, TaskType::Task); + c->SendTaskFailed(active_task.task_id, 0, TaskType::Task); // Remove the task from the client c->CancelTask(0, TaskType::Task); // It is a conscious decision to only fail one task per call to this method, @@ -2450,18 +2755,20 @@ void ClientTaskState::TaskPeriodicChecks(Client *c) // TODO: shared tasks -- although that will probably be manager in world checking and telling zones to fail us - if (ActiveTaskCount == 0) + if (active_task_count == 0) { return; + } // Check for tasks that have failed because they have not been completed in the specified time // for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TASKSLOTEMPTY) + if (active_quests[i].task_id == TASKSLOTEMPTY) { continue; + } if (TaskOutOfTime(TaskType::Quest, i)) { // Send Red Task Failed Message - c->SendTaskFailed(ActiveQuests[i].TaskID, i, TaskType::Quest); + c->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); // Remove the task from the client c->CancelTask(i, TaskType::Quest); // It is a conscious decision to only fail one task per call to this method, @@ -2473,11 +2780,11 @@ void ClientTaskState::TaskPeriodicChecks(Client *c) // Check for activities that require zoning into a specific zone. // This is done in this method because it gives an extra few seconds for the client screen to display - // the zone before we send the 'Task Activity Completed' message. + // the zone before we send the 'Task activity_information Completed' message. // - if (!CheckedTouchActivities) { + if (!checked_touch_activities) { UpdateTasksOnTouch(c, zone->GetZoneID()); - CheckedTouchActivities = true; + checked_touch_activities = true; } } @@ -2493,7 +2800,7 @@ void Client::SendTaskComplete(int TaskIndex) { tcs = (TaskComplete_Struct*)outapp->pBuffer; // I have seen unknown0 as non-zero. It always seems to match the value in the first word of the - // Task Activity Complete packet sent immediately prior to it. + // Task activity_information Complete packet sent immediately prior to it. //tcs->unknown00 = 0x00000000; tcs->unknown00 = TaskIndex; // I have only seen 0x00000002 in the next field. This is a common 'unknown' value in the task packets. @@ -2511,7 +2818,8 @@ void Client::SendTaskComplete(int TaskIndex) { } #endif -void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) { +void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) +{ Log(Logs::General, Logs::Tasks, "[UPDATE] Task History Requested for Completed Task Index %i", TaskIndex); @@ -2519,22 +2827,23 @@ void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) { int AdjustedTaskIndex = TaskIndex; - if(CompletedTasks.size() > 50) - AdjustedTaskIndex += (CompletedTasks.size() - 50); + if (completed_tasks.size() > 50) { + AdjustedTaskIndex += (completed_tasks.size() - 50); + } - if((AdjustedTaskIndex < 0) || (AdjustedTaskIndex >= (int)CompletedTasks.size())) return; + if ((AdjustedTaskIndex < 0) || (AdjustedTaskIndex >= (int) completed_tasks.size())) { return; } - int TaskID = CompletedTasks[AdjustedTaskIndex].TaskID; + int TaskID = completed_tasks[AdjustedTaskIndex].task_id; - if((TaskID < 0) || (TaskID > MAXTASKS)) return; + if ((TaskID < 0) || (TaskID > MAXTASKS)) { return; } - TaskInformation* Task = taskmanager->Tasks[TaskID]; + TaskInformation *Task = p_task_manager->Tasks[TaskID]; - if(Task == nullptr) return; + if (Task == nullptr) { return; } - TaskHistoryReplyHeader_Struct* ths; - TaskHistoryReplyData1_Struct* thd1; - TaskHistoryReplyData2_Struct* thd2; + TaskHistoryReplyHeader_Struct *ths; + TaskHistoryReplyData1_Struct *thd1; + TaskHistoryReplyData2_Struct *thd2; char *Ptr; @@ -2542,20 +2851,20 @@ void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) { int PacketLength = sizeof(TaskHistoryReplyHeader_Struct); - for(int i=0; iActivityCount; i++) { - if(CompletedTasks[AdjustedTaskIndex].ActivityDone[i]) { + for (int i = 0; i < Task->activity_count; i++) { + if (completed_tasks[AdjustedTaskIndex].activity_done[i]) { CompletedActivityCount++; PacketLength = PacketLength + sizeof(TaskHistoryReplyData1_Struct) + - Task->Activity[i].target_name.size() + 1 + - Task->Activity[i].item_list.size() + 1 + - sizeof(TaskHistoryReplyData2_Struct) + - Task->Activity[i].desc_override.size() + 1; + Task->activity_information[i].target_name.size() + 1 + + Task->activity_information[i].item_list.size() + 1 + + sizeof(TaskHistoryReplyData2_Struct) + + Task->activity_information[i].desc_override.size() + 1; } } auto outapp = new EQApplicationPacket(OP_TaskHistoryReply, PacketLength); - ths = (TaskHistoryReplyHeader_Struct*)outapp->pBuffer; + ths = (TaskHistoryReplyHeader_Struct *) outapp->pBuffer; // We use the TaskIndex the client sent in the request ths->TaskID = TaskIndex; @@ -2564,21 +2873,21 @@ void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) { Ptr = (char *) ths + sizeof(TaskHistoryReplyHeader_Struct); - for(int i=0; iActivityCount; i++) { - if(CompletedTasks[AdjustedTaskIndex].ActivityDone[i]) { - thd1 = (TaskHistoryReplyData1_Struct*)Ptr; - thd1->ActivityType = Task->Activity[i].Type; - Ptr = (char *)thd1 + sizeof(TaskHistoryReplyData1_Struct); - VARSTRUCT_ENCODE_STRING(Ptr, Task->Activity[i].target_name.c_str()); - VARSTRUCT_ENCODE_STRING(Ptr, Task->Activity[i].item_list.c_str()); - thd2 = (TaskHistoryReplyData2_Struct*)Ptr; - thd2->GoalCount = Task->Activity[i].GoalCount; + for (int i = 0; i < Task->activity_count; i++) { + if (completed_tasks[AdjustedTaskIndex].activity_done[i]) { + thd1 = (TaskHistoryReplyData1_Struct *) Ptr; + thd1->ActivityType = Task->activity_information[i].Type; + Ptr = (char *) thd1 + sizeof(TaskHistoryReplyData1_Struct); + VARSTRUCT_ENCODE_STRING(Ptr, Task->activity_information[i].target_name.c_str()); + VARSTRUCT_ENCODE_STRING(Ptr, Task->activity_information[i].item_list.c_str()); + thd2 = (TaskHistoryReplyData2_Struct *) Ptr; + thd2->GoalCount = Task->activity_information[i].GoalCount; thd2->unknown04 = 0xffffffff; thd2->unknown08 = 0xffffffff; - thd2->ZoneID = Task->Activity[i].ZoneIDs.empty() ? 0 : Task->Activity[i].ZoneIDs.front(); + thd2->ZoneID = Task->activity_information[i].ZoneIDs.empty() ? 0 : Task->activity_information[i].ZoneIDs.front(); thd2->unknown16 = 0x00000000; - Ptr = (char *)thd2 + sizeof(TaskHistoryReplyData2_Struct); - VARSTRUCT_ENCODE_STRING(Ptr, Task->Activity[i].desc_override.c_str()); + Ptr = (char *) thd2 + sizeof(TaskHistoryReplyData2_Struct); + VARSTRUCT_ENCODE_STRING(Ptr, Task->activity_information[i].desc_override.c_str()); } } @@ -2587,25 +2896,24 @@ void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) { safe_delete(outapp); - } -void Client::SendTaskActivityComplete(int TaskID, int ActivityID, int TaskIndex, TaskType type, int TaskIncomplete) +void Client::SendTaskActivityComplete(int task_id, int activity_id, int task_index, TaskType task_type, int task_incomplete) { // 0x54eb - TaskActivityComplete_Struct* tac; + TaskActivityComplete_Struct *tac; auto outapp = new EQApplicationPacket(OP_TaskActivityComplete, sizeof(TaskActivityComplete_Struct)); - tac = (TaskActivityComplete_Struct*)outapp->pBuffer; + tac = (TaskActivityComplete_Struct *) outapp->pBuffer; - tac->TaskIndex = TaskIndex; - tac->TaskType = static_cast(type); - tac->TaskID = TaskID; - tac->ActivityID = ActivityID; + tac->TaskIndex = task_index; + tac->TaskType = static_cast(task_type); + tac->TaskID = task_id; + tac->ActivityID = activity_id; tac->task_completed = 0x00000001; - tac->stage_complete = TaskIncomplete; + tac->stage_complete = task_incomplete; QueuePacket(outapp); @@ -2613,24 +2921,24 @@ void Client::SendTaskActivityComplete(int TaskID, int ActivityID, int TaskIndex, } -void Client::SendTaskFailed(int TaskID, int TaskIndex, TaskType type) +void Client::SendTaskFailed(int task_id, int task_index, TaskType task_type) { // 0x54eb char buf[24]; - snprintf(buf, 23, "%d", TaskID); + snprintf(buf, 23, "%d", task_id); buf[23] = '\0'; parse->EventPlayer(EVENT_TASK_FAIL, this, buf, 0); - TaskActivityComplete_Struct* tac; + TaskActivityComplete_Struct *tac; auto outapp = new EQApplicationPacket(OP_TaskActivityComplete, sizeof(TaskActivityComplete_Struct)); - tac = (TaskActivityComplete_Struct*)outapp->pBuffer; + tac = (TaskActivityComplete_Struct *) outapp->pBuffer; - tac->TaskIndex = TaskIndex; - tac->TaskType = static_cast(type); - tac->TaskID = TaskID; - tac->ActivityID = 0; + tac->TaskIndex = task_index; + tac->TaskType = static_cast(task_type); + tac->TaskID = task_id; + tac->ActivityID = 0; tac->task_completed = 0; //Fail tac->stage_complete = 0; // 0 for task complete or failed. @@ -2640,7 +2948,8 @@ void Client::SendTaskFailed(int TaskID, int TaskIndex, TaskType type) safe_delete(outapp); } -void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) { +void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) +{ int PacketLength = 4; @@ -2650,44 +2959,45 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) // The client only display the first 50 Completed Tasks send, so send the 50 most recent int FirstTaskToSend = 0; - int LastTaskToSend = State->CompletedTasks.size(); + int LastTaskToSend = State->completed_tasks.size(); - if(State->CompletedTasks.size() > 50) - FirstTaskToSend = State->CompletedTasks.size() - 50; + if (State->completed_tasks.size() > 50) { + FirstTaskToSend = State->completed_tasks.size() - 50; + } Log(Logs::General, Logs::Tasks, "[UPDATE] Completed Task Count: %i, First Task to send is %i, Last is %i", - State->CompletedTasks.size(), FirstTaskToSend, LastTaskToSend); + State->completed_tasks.size(), FirstTaskToSend, LastTaskToSend); /* - for(iterator=State->CompletedTasks.begin(); iterator!=State->CompletedTasks.end(); iterator++) { - int TaskID = (*iterator).TaskID; - if(Tasks[TaskID] == nullptr) continue; - PacketLength = PacketLength + 8 + strlen(Tasks[TaskID]->Title) + 1; + for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { + int task_id = (*iterator).task_id; + if(Tasks[task_id] == nullptr) continue; + PacketLength = PacketLength + 8 + strlen(Tasks[task_id]->title) + 1; } */ - for(int i = FirstTaskToSend; iCompletedTasks[i].TaskID; - if(Tasks[TaskID] == nullptr) continue; - PacketLength = PacketLength + 8 + Tasks[TaskID]->Title.size() + 1; + for (int i = FirstTaskToSend; i < LastTaskToSend; i++) { + int TaskID = State->completed_tasks[i].task_id; + if (Tasks[TaskID] == nullptr) { continue; } + PacketLength = PacketLength + 8 + Tasks[TaskID]->title.size() + 1; } auto outapp = new EQApplicationPacket(OP_CompletedTasks, PacketLength); - char *buf = (char*)outapp->pBuffer; + char *buf = (char *) outapp->pBuffer; - //*(uint32 *)buf = State->CompletedTasks.size(); - *(uint32 *)buf = LastTaskToSend - FirstTaskToSend; + //*(uint32 *)buf = activity_state->CompletedTasks.size(); + *(uint32 *) buf = LastTaskToSend - FirstTaskToSend; buf = buf + 4; - //for(iterator=State->CompletedTasks.begin(); iterator!=State->CompletedTasks.end(); iterator++) { - // int TaskID = (*iterator).TaskID; - for(int i = FirstTaskToSend; iCompletedTasks[i].TaskID; - if(Tasks[TaskID] == nullptr) continue; - *(uint32 *)buf = TaskID; + //for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { + // int task_id = (*iterator).task_id; + for (int i = FirstTaskToSend; i < LastTaskToSend; i++) { + int TaskID = State->completed_tasks[i].task_id; + if (Tasks[TaskID] == nullptr) { continue; } + *(uint32 *) buf = TaskID; buf = buf + 4; - sprintf(buf, "%s", Tasks[TaskID]->Title.c_str()); + sprintf(buf, "%s", Tasks[TaskID]->title.c_str()); buf = buf + strlen(buf) + 1; //*(uint32 *)buf = (*iterator).CompletedTime; - *(uint32 *)buf = State->CompletedTasks[i].CompletedTime; + *(uint32 *) buf = State->completed_tasks[i].completed_time; buf = buf + 4; } @@ -2697,16 +3007,14 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) } - void TaskManager::SendTaskActivityShort(Client *c, int TaskID, int ActivityID, int ClientTaskIndex) { - // This Activity Packet is sent for activities that have not yet been unlocked and appear as ??? + // This activity_information Packet is sent for activities that have not yet been unlocked and appear as ??? // in the client. - TaskActivityShort_Struct* tass; + TaskActivityShort_Struct *tass; - if (c->ClientVersionBit() & EQ::versions::maskRoFAndLater) - { + if (c->ClientVersionBit() & EQ::versions::maskRoFAndLater) { auto outapp = new EQApplicationPacket(OP_TaskActivity, 25); outapp->WriteUInt32(ClientTaskIndex); outapp->WriteUInt32(static_cast(Tasks[TaskID]->type)); @@ -2722,15 +3030,15 @@ void TaskManager::SendTaskActivityShort(Client *c, int TaskID, int ActivityID, i auto outapp = new EQApplicationPacket(OP_TaskActivity, sizeof(TaskActivityShort_Struct)); - tass = (TaskActivityShort_Struct*)outapp->pBuffer; + tass = (TaskActivityShort_Struct *) outapp->pBuffer; tass->TaskSequenceNumber = ClientTaskIndex; - tass->unknown2 = static_cast(Tasks[TaskID]->type); - tass->TaskID = TaskID; - tass->ActivityID = ActivityID; - tass->unknown3 = 0x000000; - tass->ActivityType = 0xffffffff; - tass->unknown4 = 0x00000000; + tass->unknown2 = static_cast(Tasks[TaskID]->type); + tass->TaskID = TaskID; + tass->ActivityID = ActivityID; + tass->unknown3 = 0x000000; + tass->ActivityType = 0xffffffff; + tass->unknown4 = 0x00000000; c->QueuePacket(outapp); @@ -2738,11 +3046,17 @@ void TaskManager::SendTaskActivityShort(Client *c, int TaskID, int ActivityID, i } +void TaskManager::SendTaskActivityLong( + Client *c, + int TaskID, + int ActivityID, + int ClientTaskIndex, + bool Optional, + bool TaskComplete +) +{ -void TaskManager::SendTaskActivityLong(Client *c, int TaskID, int ActivityID, int ClientTaskIndex, bool Optional, bool TaskComplete) { - - if (c->ClientVersion() >= EQ::versions::ClientVersion::RoF) - { + if (c->ClientVersion() >= EQ::versions::ClientVersion::RoF) { SendTaskActivityNew(c, TaskID, ActivityID, ClientTaskIndex, Optional, TaskComplete); return; } @@ -2755,40 +3069,44 @@ void TaskManager::SendTaskActivityLong(Client *c, int TaskID, int ActivityID, in buf.WriteUInt32(ActivityID); buf.WriteUInt32(0); // unknown3 - // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity description, so it makes - // no difference to the client. All activity updates will be done based on our interal activity types. - if((Tasks[TaskID]->Activity[ActivityID].Type > 0) && Tasks[TaskID]->Activity[ActivityID].Type < 100) - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].Type); - else - buf.WriteUInt32(ActivityCastOn); // w/e! + // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes + // no difference to the client. All activity_information updates will be done based on our interal activity_information types. + if ((Tasks[TaskID]->activity_information[ActivityID].Type > 0) && Tasks[TaskID]->activity_information[ActivityID].Type < 100) { + buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].Type); + } + else { + buf.WriteUInt32(ActivityCastOn); + } // w/e! buf.WriteUInt32(Optional); - buf.WriteUInt32(0); // solo, group, raid + buf.WriteUInt32(0); // solo, group, raid - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].target_name); // target name string - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].item_list); // item name list + buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].target_name); // target name string + buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].item_list); // item name list - if(Tasks[TaskID]->Activity[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].GoalCount); + if (Tasks[TaskID]->activity_information[ActivityID].Type != ActivityGiveCash) + buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].GoalCount); else // For our internal type GiveCash, where the goal count has the amount of cash that must be given, // we don't want the donecount and goalcount fields cluttered up with potentially large numbers, so we just - // send a goalcount of 1, and a bit further down, a donecount of 1 if the activity is complete, 0 otherwise. - // The text3 field should decribe the exact activity goal, e.g. give 3500gp to Hasten Bootstrutter. + // send a goalcount of 1, and a bit further down, a donecount of 1 if the activity_information is complete, 0 otherwise. + // The text3 field should decribe the exact activity_information goal, e.g. give 3500gp to Hasten Bootstrutter. buf.WriteUInt32(1); - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].skill_id); - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].spell_id); - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].ZoneIDs.empty() ? 0 : Tasks[TaskID]->Activity[ActivityID].ZoneIDs.front()); + buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].skill_id); + buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].spell_id); + buf.WriteUInt32( + Tasks[TaskID]->activity_information[ActivityID].ZoneIDs.empty() ? 0 : Tasks[TaskID]->activity_information[ActivityID].ZoneIDs.front()); buf.WriteUInt32(0); - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].desc_override); + buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].desc_override); - if(Tasks[TaskID]->Activity[ActivityID].Type != ActivityGiveCash) + if (Tasks[TaskID]->activity_information[ActivityID].Type != ActivityGiveCash) buf.WriteUInt32(c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID)); else - // For internal activity types, DoneCount is either 1 if the activity is complete, 0 otherwise. - buf.WriteUInt32((c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID) >= Tasks[TaskID]->Activity[ActivityID].GoalCount)); + // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. + buf.WriteUInt32((c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID) >= + Tasks[TaskID]->activity_information[ActivityID].GoalCount)); buf.WriteUInt32(1); // unknown @@ -2800,57 +3118,67 @@ void TaskManager::SendTaskActivityLong(Client *c, int TaskID, int ActivityID, in } // Used only by RoF+ Clients -void TaskManager::SendTaskActivityNew(Client *c, int TaskID, int ActivityID, int ClientTaskIndex, bool Optional, bool TaskComplete) +void TaskManager::SendTaskActivityNew( + Client *c, + int TaskID, + int ActivityID, + int ClientTaskIndex, + bool Optional, + bool TaskComplete +) { SerializeBuffer buf(100); - buf.WriteUInt32(ClientTaskIndex); // TaskSequenceNumber - buf.WriteUInt32(static_cast(Tasks[TaskID]->type)); // task type + buf.WriteUInt32(ClientTaskIndex); // TaskSequenceNumber + buf.WriteUInt32(static_cast(Tasks[TaskID]->type)); // task type buf.WriteUInt32(TaskID); buf.WriteUInt32(ActivityID); - buf.WriteUInt32(0); // unknown3 + buf.WriteUInt32(0); // unknown3 - // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity description, so it makes - // no difference to the client. All activity updates will be done based on our interal activity types. - if((Tasks[TaskID]->Activity[ActivityID].Type > 0) && Tasks[TaskID]->Activity[ActivityID].Type < 100) - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].Type); - else - buf.WriteUInt32(ActivityCastOn); // w/e! + // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes + // no difference to the client. All activity_information updates will be done based on our interal activity_information types. + if ((Tasks[TaskID]->activity_information[ActivityID].Type > 0) && Tasks[TaskID]->activity_information[ActivityID].Type < 100) { + buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].Type); + } + else { + buf.WriteUInt32(ActivityCastOn); + } // w/e! buf.WriteUInt8(Optional); - buf.WriteUInt32(0); // solo, group, raid + buf.WriteUInt32(0); // solo, group, raid - // One of these unknown fields maybe related to the 'Use On' activity types - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].target_name); // target name string + // One of these unknown fields maybe related to the 'Use On' activity_information types + buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].target_name); // target name string - buf.WriteLengthString(Tasks[TaskID]->Activity[ActivityID].item_list); // item name list + buf.WriteLengthString(Tasks[TaskID]->activity_information[ActivityID].item_list); // item name list // Goal Count - if(Tasks[TaskID]->Activity[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].GoalCount); + if (Tasks[TaskID]->activity_information[ActivityID].Type != ActivityGiveCash) + buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].GoalCount); else - buf.WriteUInt32(1); // GoalCount + buf.WriteUInt32(1); // GoalCount // skill ID list ; separated - buf.WriteLengthString(Tasks[TaskID]->Activity[ActivityID].skill_list); + buf.WriteLengthString(Tasks[TaskID]->activity_information[ActivityID].skill_list); // spelll ID list ; separated -- unsure wtf we're doing here - buf.WriteLengthString(Tasks[TaskID]->Activity[ActivityID].spell_list); + buf.WriteLengthString(Tasks[TaskID]->activity_information[ActivityID].spell_list); - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].zones); - buf.WriteUInt32(0); // unknown7 + buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].zones); + buf.WriteUInt32(0); // unknown7 - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].desc_override); // description override + buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].desc_override); // description override - if(Tasks[TaskID]->Activity[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID)); // DoneCount + if (Tasks[TaskID]->activity_information[ActivityID].Type != ActivityGiveCash) + buf.WriteUInt32(c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID)); // done_count else - // For internal activity types, DoneCount is either 1 if the activity is complete, 0 otherwise. - buf.WriteUInt32((c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID) >= Tasks[TaskID]->Activity[ActivityID].GoalCount)); + // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. + buf.WriteUInt32((c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID) >= + Tasks[TaskID]->activity_information[ActivityID].GoalCount)); - buf.WriteUInt8(1); // unknown9 + buf.WriteUInt8(1); // unknown9 - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].zones); + buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].zones); auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); @@ -2862,35 +3190,46 @@ void TaskManager::SendTaskActivityNew(Client *c, int TaskID, int ActivityID, int void TaskManager::SendActiveTasksToClient(Client *c, bool TaskComplete) { auto state = c->GetTaskState(); - if (!state) + if (!state) { return; + } for (int TaskIndex = 0; TaskIndex < MAXACTIVEQUESTS + 1; TaskIndex++) { - int TaskID = state->ActiveTasks[TaskIndex].TaskID; - if ((TaskID == 0) || (Tasks[TaskID] == 0)) + int TaskID = state->ActiveTasks[TaskIndex].task_id; + if ((TaskID == 0) || (Tasks[TaskID] == 0)) { continue; - int StartTime = state->ActiveTasks[TaskIndex].AcceptedTime; + } + int StartTime = state->ActiveTasks[TaskIndex].accepted_time; - SendActiveTaskDescription(c, TaskID, state->ActiveTasks[TaskIndex], StartTime, Tasks[TaskID]->Duration, - false); + SendActiveTaskDescription( + c, TaskID, state->ActiveTasks[TaskIndex], StartTime, Tasks[TaskID]->duration, + false + ); Log(Logs::General, Logs::Tasks, "[UPDATE] SendActiveTasksToClient: Task %i, Activities: %i", TaskID, - GetActivityCount(TaskID)); + GetActivityCount(TaskID)); - int Sequence = 0; - int fixed_index = Tasks[TaskID]->type == TaskType::Task ? 0 : TaskIndex - 1; // hmmm fuck - for (int Activity = 0; Activity < GetActivityCount(TaskID); Activity++) { + int Sequence = 0; + int fixed_index = Tasks[TaskID]->type == TaskType::Task ? 0 : TaskIndex - 1; // hmmm fuck + for (int Activity = 0; Activity < GetActivityCount(TaskID); Activity++) { if (c->GetTaskActivityState(Tasks[TaskID]->type, fixed_index, Activity) != ActivityHidden) { Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i, %i Complete=%i", TaskID, - Activity, fixed_index, TaskComplete); - if (Activity == GetActivityCount(TaskID) - 1) - SendTaskActivityLong(c, TaskID, Activity, fixed_index, - Tasks[TaskID]->Activity[Activity].Optional, TaskComplete); - else - SendTaskActivityLong(c, TaskID, Activity, fixed_index, - Tasks[TaskID]->Activity[Activity].Optional, 0); - } else { + Activity, fixed_index, TaskComplete); + if (Activity == GetActivityCount(TaskID) - 1) { + SendTaskActivityLong( + c, TaskID, Activity, fixed_index, + Tasks[TaskID]->activity_information[Activity].Optional, TaskComplete + ); + } + else { + SendTaskActivityLong( + c, TaskID, Activity, fixed_index, + Tasks[TaskID]->activity_information[Activity].Optional, 0 + ); + } + } + else { Log(Logs::General, Logs::Tasks, "[UPDATE] Short: %i, %i, %i", TaskID, Activity, - fixed_index); + fixed_index); SendTaskActivityShort(c, TaskID, Activity, fixed_index); } Sequence++; @@ -2898,59 +3237,83 @@ void TaskManager::SendActiveTasksToClient(Client *c, bool TaskComplete) } } -void TaskManager::SendSingleActiveTaskToClient(Client *c, ClientTaskInformation &task_info, bool TaskComplete, - bool BringUpTaskJournal) +void TaskManager::SendSingleActiveTaskToClient( + Client *c, ClientTaskInformation &task_info, bool TaskComplete, + bool BringUpTaskJournal +) { - int TaskID = task_info.TaskID; + int TaskID = task_info.task_id; - if (TaskID == 0 || Tasks[TaskID] == nullptr) + if (TaskID == 0 || Tasks[TaskID] == nullptr) { return; + } - int StartTime = task_info.AcceptedTime; - SendActiveTaskDescription(c, TaskID, task_info, StartTime, Tasks[TaskID]->Duration, BringUpTaskJournal); - Log(Logs::General, Logs::Tasks, "[UPDATE] SendSingleActiveTasksToClient: Task %i, Activities: %i", TaskID, GetActivityCount(TaskID)); + int StartTime = task_info.accepted_time; + SendActiveTaskDescription(c, TaskID, task_info, StartTime, Tasks[TaskID]->duration, BringUpTaskJournal); + Log(Logs::General, + Logs::Tasks, + "[UPDATE] SendSingleActiveTasksToClient: Task %i, Activities: %i", + TaskID, + GetActivityCount(TaskID)); for (int Activity = 0; Activity < GetActivityCount(TaskID); Activity++) { - if(task_info.Activity[Activity].State != ActivityHidden) { + if (task_info.activity[Activity].activity_state != ActivityHidden) { Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i Complete=%i", TaskID, Activity, TaskComplete); - if (Activity == GetActivityCount(TaskID) - 1) - SendTaskActivityLong(c, TaskID, Activity, task_info.slot, - Tasks[TaskID]->Activity[Activity].Optional, TaskComplete); - else - SendTaskActivityLong(c, TaskID, Activity, task_info.slot, - Tasks[TaskID]->Activity[Activity].Optional, 0); - } else { + if (Activity == GetActivityCount(TaskID) - 1) { + SendTaskActivityLong( + c, TaskID, Activity, task_info.slot, + Tasks[TaskID]->activity_information[Activity].Optional, TaskComplete + ); + } + else { + SendTaskActivityLong( + c, TaskID, Activity, task_info.slot, + Tasks[TaskID]->activity_information[Activity].Optional, 0 + ); + } + } + else { Log(Logs::General, Logs::Tasks, "[UPDATE] Short: %i, %i", TaskID, Activity); SendTaskActivityShort(c, TaskID, Activity, task_info.slot); } } } -void TaskManager::SendActiveTaskDescription(Client *c, int TaskID, ClientTaskInformation &task_info, int StartTime, int Duration, bool BringUpTaskJournal) +void TaskManager::SendActiveTaskDescription( + Client *c, + int TaskID, + ClientTaskInformation &task_info, + int StartTime, + int Duration, + bool BringUpTaskJournal +) { - if ((TaskID < 1) || (TaskID >= MAXTASKS) || !Tasks[TaskID]) + if ((TaskID < 1) || (TaskID >= MAXTASKS) || !Tasks[TaskID]) { return; + } - int PacketLength = sizeof(TaskDescriptionHeader_Struct) + Tasks[TaskID]->Title.length() + 1 - + sizeof(TaskDescriptionData1_Struct) + Tasks[TaskID]->Description.length() + 1 - + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); + int PacketLength = sizeof(TaskDescriptionHeader_Struct) + Tasks[TaskID]->title.length() + 1 + + sizeof(TaskDescriptionData1_Struct) + Tasks[TaskID]->description.length() + 1 + + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); - // If there is an item make the Reward text into a link to the item (only the first item if a list + // If there is an item make the reward text into a link to the item (only the first item if a list // is specified). I have been unable to get multiple item links to work. // - if(Tasks[TaskID]->RewardID && Tasks[TaskID]->item_link.empty()) { + if (Tasks[TaskID]->reward_id && Tasks[TaskID]->item_link.empty()) { int ItemID = 0; // If the reward is a list of items, and the first entry on the list is valid - if (Tasks[TaskID]->RewardMethod == METHODSINGLEID) { - ItemID = Tasks[TaskID]->RewardID; - } else if (Tasks[TaskID]->RewardMethod == METHODLIST) { - ItemID = GoalListManager.GetFirstEntry(Tasks[TaskID]->RewardID); - if (ItemID < 0) + if (Tasks[TaskID]->reward_method == METHODSINGLEID) { + ItemID = Tasks[TaskID]->reward_id; + } + else if (Tasks[TaskID]->reward_method == METHODLIST) { + ItemID = GoalListManager.GetFirstEntry(Tasks[TaskID]->reward_id); + if (ItemID < 0) { ItemID = 0; + } } - if(ItemID) { - const EQ::ItemData* reward_item = database.GetItem(ItemID); + if (ItemID) { + const EQ::ItemData *reward_item = database.GetItem(ItemID); EQ::SayLinkEngine linker; linker.SetLinkType(EQ::saylink::SayLinkItemData); @@ -2960,65 +3323,65 @@ void TaskManager::SendActiveTaskDescription(Client *c, int TaskID, ClientTaskInf } } - PacketLength += Tasks[TaskID]->Reward.length() + 1 + Tasks[TaskID]->item_link.length() + 1; + PacketLength += Tasks[TaskID]->reward.length() + 1 + Tasks[TaskID]->item_link.length() + 1; - char *Ptr; - TaskDescriptionHeader_Struct* tdh; - TaskDescriptionData1_Struct* tdd1; - TaskDescriptionData2_Struct* tdd2; - TaskDescriptionTrailer_Struct* tdt; + char *Ptr; + TaskDescriptionHeader_Struct *tdh; + TaskDescriptionData1_Struct *tdd1; + TaskDescriptionData2_Struct *tdd2; + TaskDescriptionTrailer_Struct *tdt; auto outapp = new EQApplicationPacket(OP_TaskDescription, PacketLength); - tdh = (TaskDescriptionHeader_Struct*)outapp->pBuffer; + tdh = (TaskDescriptionHeader_Struct *) outapp->pBuffer; tdh->SequenceNumber = task_info.slot; - tdh->TaskID = TaskID; - tdh->open_window = BringUpTaskJournal; - tdh->task_type = static_cast(Tasks[TaskID]->type); - tdh->reward_type = 0; // TODO: 4 says Radiant Crystals else Ebon Crystals when shared task + tdh->TaskID = TaskID; + tdh->open_window = BringUpTaskJournal; + tdh->task_type = static_cast(Tasks[TaskID]->type); + tdh->reward_type = 0; // TODO: 4 says Radiant Crystals else Ebon Crystals when shared task Ptr = (char *) tdh + sizeof(TaskDescriptionHeader_Struct); - sprintf(Ptr, "%s", Tasks[TaskID]->Title.c_str()); - Ptr += Tasks[TaskID]->Title.length() + 1; + sprintf(Ptr, "%s", Tasks[TaskID]->title.c_str()); + Ptr += Tasks[TaskID]->title.length() + 1; - tdd1 = (TaskDescriptionData1_Struct*)Ptr; + tdd1 = (TaskDescriptionData1_Struct *) Ptr; tdd1->Duration = Duration; - tdd1->dur_code = static_cast(Tasks[TaskID]->dur_code); + tdd1->dur_code = static_cast(Tasks[TaskID]->duration_code); tdd1->StartTime = StartTime; Ptr = (char *) tdd1 + sizeof(TaskDescriptionData1_Struct); - sprintf(Ptr, "%s", Tasks[TaskID]->Description.c_str()); - Ptr += Tasks[TaskID]->Description.length() + 1; + sprintf(Ptr, "%s", Tasks[TaskID]->description.c_str()); + Ptr += Tasks[TaskID]->description.length() + 1; - tdd2 = (TaskDescriptionData2_Struct*)Ptr; + tdd2 = (TaskDescriptionData2_Struct *) Ptr; // we have this reward stuff! // if we ever don't hardcode this, TaskDescriptionTrailer_Struct will need to be fixed since // "has_reward_selection" is after this bool! Smaller packet when this is 0 tdd2->has_rewards = 1; - tdd2->coin_reward = Tasks[TaskID]->CashReward; - tdd2->xp_reward = Tasks[TaskID]->XPReward ? 1 : 0; // just booled + tdd2->coin_reward = Tasks[TaskID]->cash_reward; + tdd2->xp_reward = Tasks[TaskID]->experience_reward ? 1 : 0; // just booled tdd2->faction_reward = Tasks[TaskID]->faction_reward ? 1 : 0; // faction booled Ptr = (char *) tdd2 + sizeof(TaskDescriptionData2_Struct); // we actually have 2 strings here. One is max length 96 and not parsed for item links // We actually skipped past that string incorrectly before, so TODO: fix item link string - sprintf(Ptr, "%s", Tasks[TaskID]->Reward.c_str()); - Ptr += Tasks[TaskID]->Reward.length() + 1; + sprintf(Ptr, "%s", Tasks[TaskID]->reward.c_str()); + Ptr += Tasks[TaskID]->reward.length() + 1; // second string is parsed for item links sprintf(Ptr, "%s", Tasks[TaskID]->item_link.c_str()); Ptr += Tasks[TaskID]->item_link.length() + 1; - tdt = (TaskDescriptionTrailer_Struct*)Ptr; - tdt->Points = 0x00000000; // Points Count TODO: this does have a visible affect on the client ... + tdt = (TaskDescriptionTrailer_Struct *) Ptr; + tdt->Points = 0x00000000; // Points Count TODO: this does have a visible affect on the client ... tdt->has_reward_selection = 0; // TODO: new rewards window c->QueuePacket(outapp); @@ -3028,17 +3391,19 @@ void TaskManager::SendActiveTaskDescription(Client *c, int TaskID, ClientTaskInf bool ClientTaskState::IsTaskActivityCompleted(TaskType type, int index, int ActivityID) { switch (type) { - case TaskType::Task: - if (index != 0) + case TaskType::Task: + if (index != 0) { + return false; + } + return active_task.activity[ActivityID].activity_state == ActivityCompleted; + case TaskType::Shared: + return false; // TODO: shared tasks + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + return active_quests[index].activity[ActivityID].activity_state == ActivityCompleted; + } + default: return false; - return ActiveTask.Activity[ActivityID].State == ActivityCompleted; - case TaskType::Shared: - return false; // TODO: shared tasks - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) - return ActiveQuests[index].Activity[ActivityID].State == ActivityCompleted; - default: - return false; } } @@ -3047,59 +3412,65 @@ bool ClientTaskState::IsTaskActivityCompleted(TaskType type, int index, int Acti ActivityState ClientTaskState::GetTaskActivityState(TaskType type, int index, int ActivityID) { switch (type) { - case TaskType::Task: - if (index != 0) + case TaskType::Task: + if (index != 0) { + return ActivityHidden; + } + return active_task.activity[ActivityID].activity_state; + case TaskType::Shared: + return ActivityHidden; // TODO: shared tasks + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + return active_quests[index].activity[ActivityID].activity_state; + } + default: return ActivityHidden; - return ActiveTask.Activity[ActivityID].State; - case TaskType::Shared: - return ActivityHidden; // TODO: shared tasks - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) - return ActiveQuests[index].Activity[ActivityID].State; - default: - return ActivityHidden; } } int ClientTaskState::GetTaskActivityDoneCount(TaskType type, int index, int ActivityID) { switch (type) { - case TaskType::Task: - if (index != 0) + case TaskType::Task: + if (index != 0) { + return 0; + } + return active_task.activity[ActivityID].done_count; + case TaskType::Shared: + return 0; // TODO: shared tasks + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + return active_quests[index].activity[ActivityID].done_count; + } + default: return 0; - return ActiveTask.Activity[ActivityID].DoneCount; - case TaskType::Shared: - return 0; // TODO: shared tasks - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) - return ActiveQuests[index].Activity[ActivityID].DoneCount; - default: - return 0; } } int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int TaskID, int ActivityID) { - if (ActiveTask.TaskID == TaskID) - return ActiveTask.Activity[ActivityID].DoneCount; + if (active_task.task_id == TaskID) { + return active_task.activity[ActivityID].done_count; + } // TODO: shared tasks - int ActiveTaskIndex = -1; - for(int i=0; ipBuffer; + CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; cts->SequenceNumber = SequenceNumber; - cts->type = static_cast(type); + cts->type = static_cast(type); Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask"); c->QueuePacket(outapp); safe_delete(outapp); - if(RemoveFromDB) + if (RemoveFromDB) { RemoveTask(c, SequenceNumber, type); + } } void ClientTaskState::RemoveTask(Client *c, int sequenceNumber, TaskType type) @@ -3159,67 +3532,81 @@ void ClientTaskState::RemoveTask(Client *c, int sequenceNumber, TaskType type) int task_id = -1; switch (type) { - case TaskType::Task: - if (sequenceNumber == 0) - task_id = ActiveTask.TaskID; - break; - case TaskType::Quest: - if (sequenceNumber < MAXACTIVEQUESTS) - task_id = ActiveQuests[sequenceNumber].TaskID; - break; - case TaskType::Shared: // TODO: - default: - break; + case TaskType::Task: + if (sequenceNumber == 0) { + task_id = active_task.task_id; + } + break; + case TaskType::Quest: + if (sequenceNumber < MAXACTIVEQUESTS) { + task_id = active_quests[sequenceNumber].task_id; + } + break; + case TaskType::Shared: // TODO: + default: + break; } - std::string query = StringFormat("DELETE FROM character_activities WHERE charid=%i AND taskid = %i", - characterID, task_id); - auto results = database.QueryDatabase(query); + std::string query = StringFormat( + "DELETE FROM character_activities WHERE charid=%i AND taskid = %i", + characterID, task_id + ); + auto results = database.QueryDatabase(query); if (!results.Success()) { LogError("[TASKS] Error in CientTaskState::CancelTask [{}]", - results.ErrorMessage().c_str()); + results.ErrorMessage().c_str()); return; } Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask: %s", query.c_str()); - query = StringFormat("DELETE FROM character_tasks WHERE charid=%i AND taskid = %i AND type=%i", characterID, - task_id, static_cast(type)); + query = StringFormat( + "DELETE FROM character_tasks WHERE charid=%i AND taskid = %i AND type=%i", characterID, + task_id, static_cast(type)); results = database.QueryDatabase(query); if (!results.Success()) LogError("[TASKS] Error in CientTaskState::CancelTask [{}]", - results.ErrorMessage().c_str()); + results.ErrorMessage().c_str()); Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask: %s", query.c_str()); switch (type) { - case TaskType::Task: - ActiveTask.TaskID = TASKSLOTEMPTY; - break; - case TaskType::Shared: - break; // TODO: shared tasks - case TaskType::Quest: - ActiveQuests[sequenceNumber].TaskID = TASKSLOTEMPTY; - ActiveTaskCount--; - break; - default: - break; + case TaskType::Task: + active_task.task_id = TASKSLOTEMPTY; + break; + case TaskType::Shared: + break; // TODO: shared tasks + case TaskType::Quest: + active_quests[sequenceNumber].task_id = TASKSLOTEMPTY; + active_task_count--; + break; + default: + break; } } void ClientTaskState::RemoveTaskByTaskID(Client *c, uint32 task_id) { - auto task_type = taskmanager->GetTaskType(task_id); - int character_id = c->CharacterID(); + auto task_type = p_task_manager->GetTaskType(task_id); + int character_id = c->CharacterID(); Log(Logs::General, Logs::Tasks, "[UPDATE] RemoveTaskByTaskID: %d", task_id); - std::string query = fmt::format("DELETE FROM character_activities WHERE charid = {} AND taskid = {}", character_id, task_id); - auto results = database.QueryDatabase(query); + std::string query = fmt::format( + "DELETE FROM character_activities WHERE charid = {} AND taskid = {}", + character_id, + task_id + ); + auto results = database.QueryDatabase(query); if (!results.Success()) { LogError("[TASKS] Error in CientTaskState::RemoveTaskByTaskID [{}]", results.ErrorMessage().c_str()); return; } LogTasks("[UPDATE] RemoveTaskByTaskID: {}", query.c_str()); - query = fmt::format("DELETE FROM character_tasks WHERE charid = {} AND taskid = {} AND type = {}", character_id, task_id, (int) task_type); + query = fmt::format( + "DELETE FROM character_tasks WHERE charid = {} AND taskid = {} AND type = {}", + character_id, + task_id, + (int) task_type + ); results = database.QueryDatabase(query); if (!results.Success()) { LogError("[TASKS] Error in ClientTaskState::RemoveTaskByTaskID [{}]", results.ErrorMessage().c_str()); @@ -3228,35 +3615,32 @@ void ClientTaskState::RemoveTaskByTaskID(Client *c, uint32 task_id) LogTasks("[UPDATE] RemoveTaskByTaskID: {}", query.c_str()); switch (task_type) { - case TaskType::Task: - { - if (ActiveTask.TaskID == task_id) { - auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); - CancelTask_Struct* cts = (CancelTask_Struct*)outapp->pBuffer; + case TaskType::Task: { + if (active_task.task_id == task_id) { + auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); + CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; cts->SequenceNumber = 0; - cts->type = static_cast(task_type); + cts->type = static_cast(task_type); LogTasks("[UPDATE] RemoveTaskByTaskID found Task [{}]", task_id); c->QueuePacket(outapp); safe_delete(outapp); - ActiveTask.TaskID = TASKSLOTEMPTY; + active_task.task_id = TASKSLOTEMPTY; } break; } - case TaskType::Shared: - { + case TaskType::Shared: { break; // TODO: shared tasks } - case TaskType::Quest: - { + case TaskType::Quest: { for (int active_quest = 0; active_quest < MAXACTIVEQUESTS; active_quest++) { - if (ActiveQuests[active_quest].TaskID == task_id) { - auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); - CancelTask_Struct* cts = (CancelTask_Struct*)outapp->pBuffer; + if (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); + cts->type = static_cast(task_type); LogTasks("[UPDATE] RemoveTaskByTaskID found Quest [{}] at index [{}]", task_id, active_quest); - ActiveQuests[active_quest].TaskID = TASKSLOTEMPTY; - ActiveTaskCount--; + active_quests[active_quest].task_id = TASKSLOTEMPTY; + active_task_count--; c->QueuePacket(outapp); safe_delete(outapp); } @@ -3270,35 +3654,37 @@ void ClientTaskState::RemoveTaskByTaskID(Client *c, uint32 task_id) void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enforce_level_requirement) { - if (!taskmanager || TaskID < 0 || TaskID >= MAXTASKS) { - c->Message(Chat::Red, "Task system not functioning, or TaskID %i out of range.", TaskID); + if (!p_task_manager || TaskID < 0 || TaskID >= MAXTASKS) { + c->Message(Chat::Red, "Task system not functioning, or task_id %i out of range.", TaskID); return; } - auto task = taskmanager->Tasks[TaskID]; + auto task = p_task_manager->Tasks[TaskID]; if (task == nullptr) { - c->Message(Chat::Red, "Invalid TaskID %i", TaskID); + c->Message(Chat::Red, "Invalid task_id %i", TaskID); return; } bool max_tasks = false; switch (task->type) { - case TaskType::Task: - if (ActiveTask.TaskID != TASKSLOTEMPTY) + case TaskType::Task: + if (active_task.task_id != TASKSLOTEMPTY) { + max_tasks = true; + } + break; + case TaskType::Shared: // TODO: shared tasks + // if (something) max_tasks = true; - break; - case TaskType::Shared: // TODO: shared tasks - // if (something) - max_tasks = true; - break; - case TaskType::Quest: - if (ActiveTaskCount == MAXACTIVEQUESTS) - max_tasks = true; - break; - default: - break; + break; + case TaskType::Quest: + if (active_task_count == MAXACTIVEQUESTS) { + max_tasks = true; + } + break; + default: + break; } if (max_tasks) { @@ -3309,20 +3695,21 @@ void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enfor // only Quests can have more than one, so don't need to check others if (task->type == TaskType::Quest) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) { + if (active_quests[i].task_id == TaskID) { c->Message(Chat::Red, "You have already been assigned this task."); return; } } } - if (enforce_level_requirement && !taskmanager->AppropriateLevel(TaskID, c->GetLevel())) { + if (enforce_level_requirement && !p_task_manager->ValidateLevel(TaskID, c->GetLevel())) { c->Message(Chat::Red, "You are outside the level range of this task."); return; } - if (!taskmanager->IsTaskRepeatable(TaskID) && IsTaskCompleted(TaskID)) + if (!p_task_manager->IsTaskRepeatable(TaskID) && IsTaskCompleted(TaskID)) { return; + } // We do it this way, because when the Client cancels a task, it retains the sequence number of the remaining // tasks in it's window, until something causes the TaskDescription packets to be sent again. We could just @@ -3331,25 +3718,25 @@ void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enfor // ClientTaskInformation *active_slot = nullptr; switch (task->type) { - case TaskType::Task: - active_slot = &ActiveTask; - break; - case TaskType::Shared: // TODO: shared - active_slot = nullptr; - break; - case TaskType::Quest: - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] ClientTaskState Looking for free slot in slot %i, found TaskID of %i", i, - ActiveQuests[i].TaskID); - if (ActiveQuests[i].TaskID == 0) { - active_slot = &ActiveQuests[i]; - break; + case TaskType::Task: + active_slot = &active_task; + break; + case TaskType::Shared: // TODO: shared + active_slot = nullptr; + break; + case TaskType::Quest: + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + Log(Logs::General, Logs::Tasks, + "[UPDATE] ClientTaskState Looking for free slot in slot %i, found task_id of %i", i, + active_quests[i].task_id); + if (active_quests[i].task_id == 0) { + active_slot = &active_quests[i]; + break; + } } - } - break; - default: - break; + break; + default: + break; } // This shouldn't happen unless there is a bug in the handling of ActiveTaskCount somewhere @@ -3358,47 +3745,55 @@ void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enfor return; } - active_slot->TaskID = TaskID; - active_slot->AcceptedTime = time(nullptr); - active_slot->Updated = true; - active_slot->CurrentStep = -1; + active_slot->task_id = TaskID; + active_slot->accepted_time = time(nullptr); + active_slot->updated = true; + active_slot->current_step = -1; - for (int i = 0; i < taskmanager->Tasks[TaskID]->ActivityCount; i++) { - active_slot->Activity[i].ActivityID = i; - active_slot->Activity[i].DoneCount = 0; - active_slot->Activity[i].State = ActivityHidden; - active_slot->Activity[i].Updated = true; + for (int i = 0; i < p_task_manager->Tasks[TaskID]->activity_count; i++) { + active_slot->activity[i].activity_id = i; + active_slot->activity[i].done_count = 0; + active_slot->activity[i].activity_state = ActivityHidden; + active_slot->activity[i].updated = true; } UnlockActivities(c->CharacterID(), *active_slot); - if (task->type == TaskType::Quest) - ActiveTaskCount++; + if (task->type == TaskType::Quest) { + active_task_count++; + } - taskmanager->SendSingleActiveTaskToClient(c, *active_slot, false, true); - c->Message(Chat::White, "You have been assigned the task '%s'.", taskmanager->Tasks[TaskID]->Title.c_str()); - taskmanager->SaveClientState(c, this); + p_task_manager->SendSingleActiveTaskToClient(c, *active_slot, false, true); + c->Message(Chat::White, "You have been assigned the task '%s'.", p_task_manager->Tasks[TaskID]->title.c_str()); + p_task_manager->SaveClientState(c, this); std::string buf = std::to_string(TaskID); NPC *npc = entity_list.GetID(NPCID)->CastToNPC(); - if(npc) { + if (npc) { parse->EventNPC(EVENT_TASK_ACCEPTED, npc, c, buf.c_str(), 0); } } -void ClientTaskState::ProcessTaskProximities(Client *c, float X, float Y, float Z) { +void ClientTaskState::ProcessTaskProximities(Client *c, float X, float Y, float Z) +{ float LastX = c->ProximityX(); float LastY = c->ProximityY(); float LastZ = c->ProximityZ(); - if((LastX==X) && (LastY==Y) && (LastZ==Z)) return; + if ((LastX == X) && (LastY == Y) && (LastZ == Z)) { return; } Log(Logs::General, Logs::Tasks, "[PROXIMITY] Checking proximities for Position %8.3f, %8.3f, %8.3f", X, Y, Z); - int ExploreID = taskmanager->ProximityManager.CheckProximities(X, Y, Z); + int ExploreID = p_task_manager->ProximityManager.CheckProximities(X, Y, Z); - if(ExploreID > 0) { - Log(Logs::General, Logs::Tasks, "[PROXIMITY] Position %8.3f, %8.3f, %8.3f is within proximity %i", X, Y, Z, ExploreID); + if (ExploreID > 0) { + Log(Logs::General, + Logs::Tasks, + "[PROXIMITY] Position %8.3f, %8.3f, %8.3f is within proximity %i", + X, + Y, + Z, + ExploreID); UpdateTasksOnExplore(c, ExploreID); } } @@ -3421,22 +3816,21 @@ bool TaskGoalListManager::LoadLists() NumberOfLists = 0; - std::string query = "SELECT `listid`, COUNT(`entry`) " - "FROM `goallists` GROUP by `listid` " - "ORDER BY `listid`"; - auto results = content_db.QueryDatabase(query); + std::string query = "SELECT `listid`, COUNT(`entry`) " + "FROM `goallists` GROUP by `listid` " + "ORDER BY `listid`"; + auto results = content_db.QueryDatabase(query); if (!results.Success()) { return false; } NumberOfLists = results.RowCount(); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Database returned a count of %i lists", NumberOfLists); + LogTasks("Loading GoalLists [{}] lists", NumberOfLists); TaskGoalLists.reserve(NumberOfLists); - int list_index = 0; - - for (auto row = results.begin(); row != results.end(); ++row) { + int list_index = 0; + for (auto row = results.begin(); row != results.end(); ++row) { int listID = atoi(row[0]); int listSize = atoi(row[1]); @@ -3448,10 +3842,9 @@ bool TaskGoalListManager::LoadLists() } auto goal_lists = GoallistsRepository::GetWhere(content_db, "TRUE ORDER BY listid, entry ASC"); - for (list_index = 0; list_index < NumberOfLists; list_index++) { - int list_id = TaskGoalLists[list_index].ListID; + int list_id = TaskGoalLists[list_index].ListID; for (auto &entry: goal_lists) { if (entry.listid == list_id) { @@ -3479,41 +3872,44 @@ bool TaskGoalListManager::LoadLists() } -int TaskGoalListManager::GetListByID(int ListID) { +int TaskGoalListManager::GetListByID(int ListID) +{ // Find the list with the specified ListID and return the index - auto it = std::find_if(TaskGoalLists.begin(), TaskGoalLists.end(), - [ListID](const TaskGoalList_Struct &t) { return t.ListID == ListID; }); + auto it = std::find_if( + TaskGoalLists.begin(), + TaskGoalLists.end(), + [ListID](const TaskGoalList_Struct &t) { return t.ListID == ListID; } + ); - if (it == TaskGoalLists.end()) + if (it == TaskGoalLists.end()) { return -1; + } return std::distance(TaskGoalLists.begin(), it); } -int TaskGoalListManager::GetFirstEntry(int ListID) { - +int TaskGoalListManager::GetFirstEntry(int ListID) +{ int ListIndex = GetListByID(ListID); - if((ListIndex < 0) || (ListIndex >= NumberOfLists)) return -1; + if ((ListIndex < 0) || (ListIndex >= NumberOfLists)) { return -1; } - if(TaskGoalLists[ListIndex].GoalItemEntries.empty()) return -1; + if (TaskGoalLists[ListIndex].GoalItemEntries.empty()) { return -1; } return TaskGoalLists[ListIndex].GoalItemEntries[0]; } -std::vector TaskGoalListManager::GetListContents(int ListID) { - +std::vector TaskGoalListManager::GetListContents(int ListID) +{ std::vector ListContents; + int ListIndex = GetListByID(ListID); - int ListIndex = GetListByID(ListID); - - if((ListIndex < 0) || (ListIndex >= NumberOfLists)) return ListContents; + if ((ListIndex < 0) || (ListIndex >= NumberOfLists)) { return ListContents; } ListContents = TaskGoalLists[ListIndex].GoalItemEntries; return ListContents; - } bool TaskGoalListManager::IsInList(int ListID, int Entry) @@ -3522,77 +3918,98 @@ bool TaskGoalListManager::IsInList(int ListID, int Entry) int ListIndex = GetListByID(ListID); - if ((ListIndex < 0) || (ListIndex >= NumberOfLists)) + if ((ListIndex < 0) || (ListIndex >= NumberOfLists)) { return false; + } - if ((Entry < TaskGoalLists[ListIndex].Min) || (Entry > TaskGoalLists[ListIndex].Max)) + if ((Entry < TaskGoalLists[ListIndex].Min) || (Entry > TaskGoalLists[ListIndex].Max)) { return false; + } - int FirstEntry = 0; - auto &task = TaskGoalLists[ListIndex]; + int FirstEntry = 0; + auto &task = TaskGoalLists[ListIndex]; auto it = std::find(task.GoalItemEntries.begin(), task.GoalItemEntries.end(), Entry); - if (it == task.GoalItemEntries.end()) + if (it == task.GoalItemEntries.end()) { return false; + } Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i) returning true", ListIndex, - Entry); + Entry); return true; } -TaskProximityManager::TaskProximityManager() { +TaskProximityManager::TaskProximityManager() +{ } -TaskProximityManager::~TaskProximityManager() { +TaskProximityManager::~TaskProximityManager() +{ } -bool TaskProximityManager::LoadProximities(int zoneID) { +bool TaskProximityManager::LoadProximities(int zoneID) +{ TaskProximity proximity; Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskProximityManager::LoadProximities Called for zone %i", zoneID); TaskProximities.clear(); - std::string query = StringFormat("SELECT `exploreid`, `minx`, `maxx`, " - "`miny`, `maxy`, `minz`, `maxz` " - "FROM `proximities` WHERE `zoneid` = %i " - "ORDER BY `zoneid` ASC", zoneID); - auto results = content_db.QueryDatabase(query); - if (!results.Success()) { + std::string query = StringFormat( + "SELECT `exploreid`, `minx`, `maxx`, " + "`miny`, `maxy`, `minz`, `maxz` " + "FROM `proximities` WHERE `zoneid` = %i " + "ORDER BY `zoneid` ASC", zoneID + ); + auto results = content_db.QueryDatabase(query); + if (!results.Success()) { return false; - } + } - for( auto row = results.begin(); row != results.end(); ++row) { - proximity.ExploreID = atoi(row[0]); - proximity.MinX = atof(row[1]); - proximity.MaxX = atof(row[2]); - proximity.MinY = atof(row[3]); - proximity.MaxY = atof(row[4]); - proximity.MinZ = atof(row[5]); - proximity.MaxZ = atof(row[6]); + for (auto row = results.begin(); row != results.end(); ++row) { + proximity.ExploreID = atoi(row[0]); + proximity.MinX = atof(row[1]); + proximity.MaxX = atof(row[2]); + proximity.MinY = atof(row[3]); + proximity.MaxY = atof(row[4]); + proximity.MinZ = atof(row[5]); + proximity.MaxZ = atof(row[6]); - TaskProximities.push_back(proximity); - } + TaskProximities.push_back(proximity); + } return true; } -int TaskProximityManager::CheckProximities(float X, float Y, float Z) { +int TaskProximityManager::CheckProximities(float X, float Y, float Z) +{ - for(unsigned int i=0; iMinX, P->MaxX, P->MinY, P->MaxY, P->MinZ, P->MaxZ); + Log(Logs::General, + Logs::Tasks, + "[PROXIMITY] Checking %8.3f, %8.3f, %8.3f against %8.3f, %8.3f, %8.3f, %8.3f, %8.3f, %8.3f", + X, + Y, + Z, + P->MinX, + P->MaxX, + P->MinY, + P->MaxY, + P->MinZ, + P->MaxZ); - if(X < P->MinX || X > P->MaxX || Y < P->MinY || Y > P->MaxY || - Z < P->MinZ || Z > P->MaxZ) continue; + if (X < P->MinX || X > P->MaxX || Y < P->MinY || Y > P->MaxY || + Z < P->MinZ || Z > P->MaxZ) { + continue; + } return P->ExploreID; diff --git a/zone/tasks.h b/zone/tasks.h index cb4cd63c1..bea2dadc0 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -39,23 +39,22 @@ Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net) #define TASKSLOTEMPTY 0 // Command Codes for worldserver ServerOP_ReloadTasks -// -#define RELOADTASKS 0 -#define RELOADTASKGOALLISTS 1 -#define RELOADTASKPROXIMITIES 2 -#define RELOADTASKSETS 3 +#define RELOADTASKS 0 +#define RELOADTASKGOALLISTS 1 +#define RELOADTASKPROXIMITIES 2 +#define RELOADTASKSETS 3 class Client; + class Mob; -namespace EQ -{ +namespace EQ { class ItemInstance; } struct TaskGoalList_Struct { - int ListID; - int Min, Max; + int ListID; + int Min, Max; std::vector GoalItemEntries; }; @@ -77,11 +76,11 @@ public: private: std::vector TaskGoalLists; - int NumberOfLists; + int NumberOfLists; }; typedef struct { - int ExploreID; + int ExploreID; float MinX, MaxX, MinY, MaxY, MinZ, MaxZ; } TaskProximity; @@ -98,99 +97,122 @@ private: std::vector TaskProximities; }; -typedef enum { METHODSINGLEID = 0, METHODLIST = 1, METHODQUEST = 2 } TaskMethodType; +typedef enum { + METHODSINGLEID = 0, + METHODLIST = 1, + METHODQUEST = 2 +} TaskMethodType; struct ActivityInformation { - int StepNumber; - int Type; - std::string target_name; // name mob, location -- default empty - std::string item_list; // likely defaults to empty - std::string skill_list; // IDs ; separated -- default -1 - std::string spell_list; // IDs ; separated -- default 0 - std::string desc_override; // overrides auto generated description -- default empty - int skill_id; // older clients, first id from above - int spell_id; // older clients, first id from above - int GoalID; - TaskMethodType GoalMethod; - int GoalCount; - int DeliverToNPC; - std::vector ZoneIDs; - std::string zones; // IDs ; searated, ZoneID is the first in this list for older clients -- default empty string - bool Optional; + int StepNumber; + int Type; + std::string target_name; // name mob, location -- default empty + std::string item_list; // likely defaults to empty + std::string skill_list; // IDs ; separated -- default -1 + std::string spell_list; // IDs ; separated -- default 0 + std::string desc_override; // overrides auto generated description -- default empty + int skill_id; // older clients, first id from above + int spell_id; // older clients, first id from above + int GoalID; + TaskMethodType GoalMethod; + int GoalCount; + int DeliverToNPC; + std::vector ZoneIDs; + std::string zones; // IDs ; searated, ZoneID is the first in this list for older clients -- default empty string + bool Optional; - inline bool CheckZone(int zone_id) { - if (ZoneIDs.empty()) + inline bool CheckZone(int zone_id) + { + if (ZoneIDs.empty()) { return true; + } return std::find(ZoneIDs.begin(), ZoneIDs.end(), zone_id) != ZoneIDs.end(); } }; -typedef enum { ActivitiesSequential = 0, ActivitiesStepped = 1 } SequenceType; +typedef enum { + ActivitiesSequential = 0, ActivitiesStepped = 1 +} SequenceType; enum class TaskType { - Task = 0, // can have at max 1 - Shared = 1, // can have at max 1 - Quest = 2, // can have at max 19 or 29 depending on client - E = 3 // can have at max 19 or 29 depending on client, not present in live anymore + Task = 0, // can have at max 1 + Shared = 1, // can have at max 1 + Quest = 2, // can have at max 19 or 29 depending on client + E = 3 // can have at max 19 or 29 depending on client, not present in live anymore }; enum class DurationCode { - None = 0, - Short = 1, + None = 0, + Short = 1, Medium = 2, - Long = 3 + Long = 3 }; struct TaskInformation { - TaskType type; - int Duration; - DurationCode dur_code; // description for time investment for when Duration == 0 - std::string Title; // max length 64 - std::string Description; // max length 4000, 2048 on Tit - std::string Reward; - std::string item_link; // max length 128 older clients, item link gets own string - std::string completion_emote; // emote after completing task, yellow. Maybe should make more generic ... but yellow for now! - int RewardID; - int CashReward; // Expressed in copper - int XPReward; - int faction_reward; // just a npc_faction_id - TaskMethodType RewardMethod; - int ActivityCount; - SequenceType SequenceMode; - int LastStep; - short MinLevel; - short MaxLevel; - bool Repeatable; - ActivityInformation Activity[MAXACTIVITIESPERTASK]; + TaskType type; + int duration; + DurationCode duration_code; // description for time investment for when duration == 0 + std::string title; // max length 64 + std::string description; // max length 4000, 2048 on Tit + std::string reward; + std::string item_link; // max length 128 older clients, item link gets own string + std::string completion_emote; // emote after completing task, yellow. Maybe should make more generic ... but yellow for now! + int reward_id; + int cash_reward; // Expressed in copper + int experience_reward; + int faction_reward; // just a npc_faction_id + TaskMethodType reward_method; + int activity_count; + SequenceType sequence_mode; + int last_step; + short min_level; + short max_level; + bool repeatable; + ActivityInformation activity_information[MAXACTIVITIESPERTASK]; }; -typedef enum { ActivityHidden = 0, ActivityActive = 1, ActivityCompleted = 2 } ActivityState; - -typedef enum { ActivityDeliver = 1, ActivityKill = 2, ActivityLoot = 3, ActivitySpeakWith = 4, ActivityExplore = 5, - ActivityTradeSkill = 6, ActivityFish = 7, ActivityForage = 8, ActivityCastOn = 9, ActivitySkillOn = 10, - ActivityTouch = 11, ActivityCollect = 13, ActivityGiveCash = 100 } ActivityType; +typedef enum { + ActivityHidden = 0, + ActivityActive = 1, + ActivityCompleted = 2 +} ActivityState; +typedef enum { + ActivityDeliver = 1, + ActivityKill = 2, + ActivityLoot = 3, + ActivitySpeakWith = 4, + ActivityExplore = 5, + ActivityTradeSkill = 6, + ActivityFish = 7, + ActivityForage = 8, + ActivityCastOn = 9, + ActivitySkillOn = 10, + ActivityTouch = 11, + ActivityCollect = 13, + ActivityGiveCash = 100 +} ActivityType; struct ClientActivityInformation { - int ActivityID; - int DoneCount; - ActivityState State; - bool Updated; // Flag so we know if we need to update the database + int activity_id; + int done_count; + ActivityState activity_state; + bool updated; // Flag so we know if we need to updated the database }; struct ClientTaskInformation { - int slot; // intrusive, but makes things easier :P - int TaskID; - int CurrentStep; - int AcceptedTime; - bool Updated; - ClientActivityInformation Activity[MAXACTIVITIESPERTASK]; + int slot; // intrusive, but makes things easier :P + int task_id; + int current_step; + int accepted_time; + bool updated; + ClientActivityInformation activity[MAXACTIVITIESPERTASK]; }; struct CompletedTaskInformation { - int TaskID; - int CompletedTime; - bool ActivityDone[MAXACTIVITIESPERTASK]; + int task_id; + int completed_time; + bool activity_done[MAXACTIVITIESPERTASK]; }; class ClientTaskState { @@ -199,7 +221,7 @@ public: ClientTaskState(); ~ClientTaskState(); void ShowClientTasks(Client *c); - inline int GetActiveTaskCount() { return ActiveTaskCount; } + inline int GetActiveTaskCount() { return active_task_count; } int GetActiveTaskID(int index); bool IsTaskActivityCompleted(TaskType type, int index, int ActivityID); int GetTaskActivityDoneCount(TaskType type, int index, int ActivityID); @@ -218,67 +240,76 @@ public: void CancelAllTasks(Client *c); void RemoveTask(Client *c, int SequenceNumber, TaskType type); void RemoveTaskByTaskID(Client *c, uint32 task_id); - bool UpdateTasksByNPC(Client *c, int ActivityType, int NPCTypeID); + bool UpdateTasksByNPC(Client *c, int activity_type, int npc_type_id); void UpdateTasksOnKill(Client *c, int NPCTypeID); - void UpdateTasksForItem(Client *c, ActivityType Type, int ItemID, int Count=1); + void UpdateTasksForItem(Client *c, ActivityType Type, int ItemID, int Count = 1); void UpdateTasksOnExplore(Client *c, int ExploreID); bool UpdateTasksOnSpeakWith(Client *c, int NPCTypeID); - bool UpdateTasksOnDeliver(Client *c, std::list& Items, int Cash, int NPCTypeID); + bool UpdateTasksOnDeliver(Client *c, std::list &Items, int Cash, int NPCTypeID); void UpdateTasksOnTouch(Client *c, int ZoneID); void ProcessTaskProximities(Client *c, float X, float Y, float Z); bool TaskOutOfTime(TaskType type, int Index); void TaskPeriodicChecks(Client *c); void SendTaskHistory(Client *c, int TaskIndex); void RewardTask(Client *c, TaskInformation *Task); - void EnableTask(int CharID, int TaskCount, int *TaskList); - void DisableTask(int CharID, int TaskCount, int *TaskList); + void EnableTask(int character_id, int task_count, int *TaskList); + void DisableTask(int character_id, int task_count, int *task_list); bool IsTaskEnabled(int TaskID); int EnabledTaskCount(int TaskSetID); - int ActiveSpeakTask(int NPCID); - int ActiveSpeakActivity(int NPCID, int TaskID); + int ActiveSpeakTask(int npc_type_id); + int ActiveSpeakActivity(int npc_type_id, int task_id); int ActiveTasksInSet(int TaskSetID); int CompletedTasksInSet(int TaskSetID); bool HasSlotForTask(TaskInformation *task); - inline bool HasFreeTaskSlot() { return ActiveTask.TaskID == TASKSLOTEMPTY; } + inline bool HasFreeTaskSlot() { return active_task.task_id == TASKSLOTEMPTY; } friend class TaskManager; private: - bool UnlockActivities(int CharID, ClientTaskInformation &task_info); - void IncrementDoneCount(Client *c, TaskInformation *Task, int TaskIndex, int ActivityID, int Count = 1, bool ignore_quest_update = false); + bool UnlockActivities(int character_id, ClientTaskInformation &task_info); + void IncrementDoneCount( + Client *c, + TaskInformation *Task, + int TaskIndex, + int ActivityID, + int Count = 1, + bool ignore_quest_update = false + ); inline ClientTaskInformation *GetClientTaskInfo(TaskType type, int index) { ClientTaskInformation *info = nullptr; switch (type) { - case TaskType::Task: - if (index == 0) - info = &ActiveTask; - break; - case TaskType::Shared: - break; - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) - info = &ActiveQuests[index]; - break; - default: - break; + case TaskType::Task: + if (index == 0) { + info = &active_task; + } + break; + case TaskType::Shared: + break; + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + info = &active_quests[index]; + } + break; + default: + break; } return info; } - int ActiveTaskCount; + int active_task_count; union { // easier to loop over struct { - ClientTaskInformation ActiveTask; // only one - ClientTaskInformation ActiveQuests[MAXACTIVEQUESTS]; + ClientTaskInformation active_task; // only one + ClientTaskInformation active_quests[MAXACTIVEQUESTS]; }; ClientTaskInformation ActiveTasks[MAXACTIVEQUESTS + 1]; }; // Shared tasks should be limited to 1 as well - std::vector EnabledTasks; - std::vector CompletedTasks; - int LastCompletedTaskLoaded; - bool CheckedTouchActivities; + std::vector enabled_tasks; + std::vector completed_tasks; + int last_completed_task_loaded; + bool checked_touch_activities; }; @@ -289,7 +320,7 @@ public: ~TaskManager(); int GetActivityCount(int TaskID); bool LoadSingleTask(int TaskID); - bool LoadTasks(int SingleTask=0); + bool LoadTasks(int SingleTask = 0); void ReloadGoalLists(); inline void LoadProximities(int ZoneID) { ProximityManager.LoadProximities(ZoneID); } bool LoadTaskSets(); @@ -297,35 +328,58 @@ public: bool SaveClientState(Client *c, ClientTaskState *state); void SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *TaskList); void SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *TaskList); - bool AppropriateLevel(int TaskID, int PlayerLevel); + bool ValidateLevel(int TaskID, int PlayerLevel); int GetTaskMinLevel(int TaskID); int GetTaskMaxLevel(int TaskID); std::string GetTaskName(uint32 task_id); TaskType GetTaskType(uint32 task_id); void TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, int TaskSetID); - void TaskQuestSetSelector(Client *c, ClientTaskState *state, Mob *mob, int count, int *tasks); // task list provided by QuestManager (perl/lua) - void SendActiveTasksToClient(Client *c, bool TaskComplete=false); - void SendSingleActiveTaskToClient(Client *c, ClientTaskInformation &task_info, bool TaskComplete, bool BringUpTaskJournal = false); + void TaskQuestSetSelector( + Client *c, + ClientTaskState *state, + Mob *mob, + int count, + int *tasks + ); // task list provided by QuestManager (perl/lua) + void SendActiveTasksToClient(Client *c, bool TaskComplete = false); + void SendSingleActiveTaskToClient( + Client *c, + ClientTaskInformation &task_info, + bool TaskComplete, + bool BringUpTaskJournal = false + ); void SendTaskActivityShort(Client *c, int TaskID, int ActivityID, int ClientTaskIndex); - void SendTaskActivityLong(Client *c, int TaskID, int ActivityID, int ClientTaskIndex, - bool Optional, bool TaskComplete=false); - void SendTaskActivityNew(Client *c, int TaskID, int ActivityID, int ClientTaskIndex, - bool Optional, bool TaskComplete=false); + void SendTaskActivityLong( + Client *c, int TaskID, int ActivityID, int ClientTaskIndex, + bool Optional, bool TaskComplete = false + ); + void SendTaskActivityNew( + Client *c, int TaskID, int ActivityID, int ClientTaskIndex, + bool Optional, bool TaskComplete = false + ); void SendCompletedTasksToClient(Client *c, ClientTaskState *state); void ExplainTask(Client *c, int TaskID); int FirstTaskInSet(int TaskSet); int LastTaskInSet(int TaskSet); int NextTaskInSet(int TaskSet, int TaskID); bool IsTaskRepeatable(int TaskID); + friend class ClientTaskState; private: - TaskGoalListManager GoalListManager; + TaskGoalListManager GoalListManager; TaskProximityManager ProximityManager; - TaskInformation* Tasks[MAXTASKS]; - std::vector TaskSets[MAXTASKSETS]; - void SendActiveTaskDescription(Client *c, int TaskID, ClientTaskInformation &task_info, int StartTime, int Duration, bool BringUpTaskJournal=false); + TaskInformation *Tasks[MAXTASKS]; + std::vector TaskSets[MAXTASKSETS]; + void SendActiveTaskDescription( + Client *c, + int TaskID, + ClientTaskInformation &task_info, + int StartTime, + int Duration, + bool BringUpTaskJournal = false + ); }; diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index eea45d057..a5772608f 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -3100,16 +3100,16 @@ void WorldServer::HandleReloadTasks(ServerPacket *pack) if (rts->Parameter == 0) { Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload ALL tasks"); - safe_delete(taskmanager); - taskmanager = new TaskManager; - taskmanager->LoadTasks(); + safe_delete(p_task_manager); + p_task_manager = new TaskManager; + p_task_manager->LoadTasks(); if (zone) - taskmanager->LoadProximities(zone->GetZoneID()); + p_task_manager->LoadProximities(zone->GetZoneID()); entity_list.ReloadAllClientsTaskState(); } else { Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload only task %i", rts->Parameter); - taskmanager->LoadTasks(rts->Parameter); + p_task_manager->LoadTasks(rts->Parameter); entity_list.ReloadAllClientsTaskState(rts->Parameter); } @@ -3118,18 +3118,18 @@ void WorldServer::HandleReloadTasks(ServerPacket *pack) case RELOADTASKPROXIMITIES: if (zone) { Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload task proximities"); - taskmanager->LoadProximities(zone->GetZoneID()); + p_task_manager->LoadProximities(zone->GetZoneID()); } break; case RELOADTASKGOALLISTS: Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload task goal lists"); - taskmanager->ReloadGoalLists(); + p_task_manager->ReloadGoalLists(); break; case RELOADTASKSETS: Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload task sets"); - taskmanager->LoadTaskSets(); + p_task_manager->LoadTaskSets(); break; default: diff --git a/zone/zone.cpp b/zone/zone.cpp index 57f886eec..f088c6cee 100755 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -964,7 +964,7 @@ Zone::Zone(uint32 in_zoneid, uint32 in_instanceid, const char* in_short_name) lootvar = 0; if(RuleB(TaskSystem, EnableTaskSystem)) { - taskmanager->LoadProximities(zoneid); + p_task_manager->LoadProximities(zoneid); } short_name = strcpy(new char[strlen(in_short_name)+1], in_short_name); From 4039cb12ba982c67a524855de2289a3cb528899c Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 01:05:34 -0600 Subject: [PATCH 02/26] Second pass --- zone/tasks.cpp | 899 ++++++++++++++++++++++++------------------------- zone/tasks.h | 106 +++--- 2 files changed, 491 insertions(+), 514 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 866c5fb2f..f7edb5424 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -46,13 +46,13 @@ extern QueryServ *QServ; TaskManager::TaskManager() { - for (auto & Task : Tasks) + for (auto & Task : p_task_data) Task = nullptr; } TaskManager::~TaskManager() { - for (auto & Task : Tasks) { + for (auto & Task : p_task_data) { if (Task != nullptr) { safe_delete(Task); } @@ -64,7 +64,7 @@ bool TaskManager::LoadTaskSets() // Clear all task sets in memory. Done so we can reload them on the fly if required by just calling // this method again. - for (auto & TaskSet : TaskSets) + for (auto & TaskSet : task_sets) TaskSet.clear(); std::string query = StringFormat( @@ -84,43 +84,28 @@ bool TaskManager::LoadTaskSets() int taskSet = atoi(row[0]); int taskID = atoi(row[1]); - TaskSets[taskSet].push_back(taskID); + task_sets[taskSet].push_back(taskID); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Adding task_id %4i to TaskSet %4i", taskID, taskSet); } return true; } -bool TaskManager::LoadSingleTask(int TaskID) -{ - - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskManager::LoadSingleTask(%i)", TaskID); - - if ((TaskID <= 0) || (TaskID >= MAXTASKS)) { return false; } - - // If this task already exists in memory, free all the dynamically allocated strings. - if (Tasks[TaskID]) { - safe_delete(Tasks[TaskID]); - } - - return LoadTasks(TaskID); -} - void TaskManager::ReloadGoalLists() { - if (!GoalListManager.LoadLists()) + if (!goal_list_manager.LoadLists()) Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadLists failed"); } -bool TaskManager::LoadTasks(int singleTask) +bool TaskManager::LoadTasks(int single_task) { // If task_id !=0, then just load the task specified. Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskManager::LoadTasks Called"); std::string query; - if (singleTask == 0) { - if (!GoalListManager.LoadLists()) + if (single_task == 0) { + if (!goal_list_manager.LoadLists()) Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadLists failed"); if (!LoadTaskSets()) @@ -138,7 +123,7 @@ bool TaskManager::LoadTasks(int singleTask) "SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," "`minlevel`, `maxlevel`, `repeatable`, `completion_emote` FROM `tasks` WHERE `id` = %i", - singleTask + single_task ); } @@ -159,35 +144,35 @@ bool TaskManager::LoadTasks(int singleTask) continue; } - Tasks[taskID] = new TaskInformation; - Tasks[taskID]->type = static_cast(atoi(row[1])); - Tasks[taskID]->duration = atoi(row[2]); - Tasks[taskID]->duration_code = static_cast(atoi(row[3])); - Tasks[taskID]->title = row[4]; - Tasks[taskID]->description = row[5]; - Tasks[taskID]->reward = row[6]; - Tasks[taskID]->reward_id = atoi(row[7]); - Tasks[taskID]->cash_reward = atoi(row[8]); - Tasks[taskID]->experience_reward = atoi(row[9]); - Tasks[taskID]->reward_method = (TaskMethodType) atoi(row[10]); - Tasks[taskID]->faction_reward = atoi(row[11]); - Tasks[taskID]->min_level = atoi(row[12]); - Tasks[taskID]->max_level = atoi(row[13]); - Tasks[taskID]->repeatable = atoi(row[14]); - Tasks[taskID]->completion_emote = row[15]; - Tasks[taskID]->activity_count = 0; - Tasks[taskID]->sequence_mode = ActivitiesSequential; - Tasks[taskID]->last_step = 0; + p_task_data[taskID] = new TaskInformation; + p_task_data[taskID]->type = static_cast(atoi(row[1])); + p_task_data[taskID]->duration = atoi(row[2]); + p_task_data[taskID]->duration_code = static_cast(atoi(row[3])); + p_task_data[taskID]->title = row[4]; + p_task_data[taskID]->description = row[5]; + p_task_data[taskID]->reward = row[6]; + p_task_data[taskID]->reward_id = atoi(row[7]); + p_task_data[taskID]->cash_reward = atoi(row[8]); + p_task_data[taskID]->experience_reward = atoi(row[9]); + p_task_data[taskID]->reward_method = (TaskMethodType) atoi(row[10]); + p_task_data[taskID]->faction_reward = atoi(row[11]); + p_task_data[taskID]->min_level = atoi(row[12]); + p_task_data[taskID]->max_level = atoi(row[13]); + p_task_data[taskID]->repeatable = atoi(row[14]); + p_task_data[taskID]->completion_emote = row[15]; + p_task_data[taskID]->activity_count = 0; + p_task_data[taskID]->sequence_mode = ActivitiesSequential; + p_task_data[taskID]->last_step = 0; Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] task_id: %5i, duration: %8i, reward: %s min_level %i max_level %i " "repeatable: %s", - taskID, Tasks[taskID]->duration, Tasks[taskID]->reward.c_str(), - Tasks[taskID]->min_level, Tasks[taskID]->max_level, Tasks[taskID]->repeatable ? "Yes" : "No"); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] title: %s", Tasks[taskID]->title.c_str()); + taskID, p_task_data[taskID]->duration, p_task_data[taskID]->reward.c_str(), + p_task_data[taskID]->min_level, p_task_data[taskID]->max_level, p_task_data[taskID]->repeatable ? "Yes" : "No"); + Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] title: %s", p_task_data[taskID]->title.c_str()); } - if (singleTask == 0) { + if (single_task == 0) { query = StringFormat( "SELECT `taskid`, `step`, `activityid`, `activitytype`, `target_name`, `item_list`, " @@ -204,7 +189,7 @@ bool TaskManager::LoadTasks(int singleTask) "`skill_list`, `spell_list`, `description_override`, `goalid`, `goalmethod`, " "`goalcount`, `delivertonpc`, `zones`, `optional` FROM `task_activities` WHERE `taskid` = " "%i AND `activityid` < %i ORDER BY taskid, activityid ASC", - singleTask, MAXACTIVITIESPERTASK + single_task, MAXACTIVITIESPERTASK ); } results = content_db.QueryDatabase(query); @@ -227,98 +212,98 @@ bool TaskManager::LoadTasks(int singleTask) continue; } - if (Tasks[taskID] == nullptr) { + if (p_task_data[taskID] == nullptr) { LogError("[TASKS]activity_information for non-existent task ([{}], [{}]) while loading activities from database", taskID, activityID); continue; } - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].StepNumber = step; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].StepNumber = step; if (step != 0) { - Tasks[taskID]->sequence_mode = ActivitiesStepped; + p_task_data[taskID]->sequence_mode = ActivitiesStepped; } - if (step > Tasks[taskID]->last_step) { - Tasks[taskID]->last_step = step; + if (step > p_task_data[taskID]->last_step) { + p_task_data[taskID]->last_step = step; } // Task Activities MUST be numbered sequentially from 0. If not, log an error // and set the task to nullptr. Subsequent activities for this task will raise // ERR_NOTASK errors. // Change to (activityID != (Tasks[taskID]->activity_count + 1)) to index from 1 - if (activityID != Tasks[taskID]->activity_count) { + if (activityID != p_task_data[taskID]->activity_count) { LogError("[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", taskID, activityID); - Tasks[taskID] = nullptr; + p_task_data[taskID] = nullptr; continue; } - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].Type = atoi(row[3]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].Type = atoi(row[3]); - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].target_name = row[4]; - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].item_list = row[5]; - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].skill_list = row[6]; - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].skill_id = atoi(row[6]); // for older clients - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].spell_list = row[7]; - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].spell_id = atoi(row[7]); // for older clients - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].desc_override = row[8]; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].target_name = row[4]; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].item_list = row[5]; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].skill_list = row[6]; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].skill_id = atoi(row[6]); // for older clients + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_list = row[7]; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_id = atoi(row[7]); // for older clients + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].desc_override = row[8]; - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalID = atoi(row[9]); - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalMethod = (TaskMethodType) atoi(row[10]); - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalCount = atoi(row[11]); - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].DeliverToNPC = atoi(row[12]); - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].zones = row[13]; - auto zones = SplitString(Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].zones, ';'); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalID = atoi(row[9]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalMethod = (TaskMethodType) atoi(row[10]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalCount = atoi(row[11]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].DeliverToNPC = atoi(row[12]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones = row[13]; + auto zones = SplitString(p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones, ';'); for (auto &&e : zones) - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].ZoneIDs.push_back(std::stoi(e)); - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].Optional = atoi(row[14]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].ZoneIDs.push_back(std::stoi(e)); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].Optional = atoi(row[14]); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] activity_information Slot %2i: ID %i for Task %5i. Type: %3i, GoalID: %8i, " "GoalMethod: %i, GoalCount: %3i, Zones:%s", - Tasks[taskID]->activity_count, activityID, taskID, - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].Type, - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalID, - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalMethod, - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].GoalCount, - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].zones.c_str()); + p_task_data[taskID]->activity_count, activityID, taskID, + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].Type, + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalID, + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalMethod, + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalCount, + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] target_name: %s", - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].target_name.c_str()); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].target_name.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] item_list: %s", - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].item_list.c_str()); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].item_list.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] skill_list: %s", - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].skill_list.c_str()); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].skill_list.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] spell_list: %s", - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].spell_list.c_str()); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_list.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] description_override: %s", - Tasks[taskID]->activity_information[Tasks[taskID]->activity_count].desc_override.c_str()); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].desc_override.c_str()); - Tasks[taskID]->activity_count++; + p_task_data[taskID]->activity_count++; } return true; } -bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) +bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_state) { // I am saving the slot in the ActiveTasks table, because unless a Task is cancelled/completed, the client // doesn't seem to like tasks moving slots between zoning and you can end up with 'bogus' activities if the task // previously in that slot had more activities than the one now occupying it. Hopefully retaining the slot // number for the duration of a session will overcome this. - if (!c || !state) { + if (!client || !client_task_state) { return false; } const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::SaveClientState %s"; - int characterID = c->CharacterID(); + int characterID = client->CharacterID(); Log(Logs::Detail, Logs::Tasks, "TaskManager::SaveClientState for character ID %d", characterID); - if (state->active_task_count > 0 || state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks - for (auto & ActiveTask : state->ActiveTasks) { + if (client_task_state->active_task_count > 0 || client_task_state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks + for (auto & ActiveTask : client_task_state->ActiveTasks) { int taskID = ActiveTask.task_id; if (taskID == TASKSLOTEMPTY) { continue; @@ -336,7 +321,7 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) std::string query = StringFormat( "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime) " "VALUES (%i, %i, %i, %i, %i)", - characterID, taskID, slot, static_cast(Tasks[taskID]->type), + characterID, taskID, slot, static_cast(p_task_data[taskID]->type), ActiveTask.accepted_time ); auto results = database.QueryDatabase(query); @@ -353,7 +338,7 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) "VALUES "; int updatedActivityCount = 0; - for (int activityIndex = 0; activityIndex < Tasks[taskID]->activity_count; ++activityIndex) { + for (int activityIndex = 0; activityIndex < p_task_data[taskID]->activity_count; ++activityIndex) { if (!ActiveTask.activity[activityIndex].updated) { continue; @@ -400,28 +385,28 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) ActiveTask.updated = false; for (int activityIndex = 0; - activityIndex < Tasks[taskID]->activity_count; + activityIndex < p_task_data[taskID]->activity_count; ++activityIndex) ActiveTask.activity[activityIndex].updated = false; } } if (!RuleB(TaskSystem, RecordCompletedTasks) || - (state->completed_tasks.size() <= (unsigned int) state->last_completed_task_loaded)) { - state->last_completed_task_loaded = state->completed_tasks.size(); + (client_task_state->completed_tasks.size() <= (unsigned int) client_task_state->last_completed_task_loaded)) { + client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); return true; } const char *completedTaskQuery = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " "VALUES (%i, %i, %i, %i)"; - for (unsigned int i = state->last_completed_task_loaded; i < state->completed_tasks.size(); i++) { + for (unsigned int i = client_task_state->last_completed_task_loaded; i < client_task_state->completed_tasks.size(); i++) { Log(Logs::General, Logs::Tasks, "[CLIENTSAVE] TaskManager::SaveClientState Saving Completed Task at slot %i", i); - int taskID = state->completed_tasks[i].task_id; + int taskID = client_task_state->completed_tasks[i].task_id; - if ((taskID <= 0) || (taskID >= MAXTASKS) || (Tasks[taskID] == nullptr)) { + if ((taskID <= 0) || (taskID >= MAXTASKS) || (p_task_data[taskID] == nullptr)) { continue; } @@ -433,7 +418,7 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) StringFormat( completedTaskQuery, characterID, - state->completed_tasks[i].completed_time, + client_task_state->completed_tasks[i].completed_time, taskID, -1 ); @@ -450,13 +435,13 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) // Insert one record for each completed optional task. - for (int j = 0; j < Tasks[taskID]->activity_count; j++) { - if (!Tasks[taskID]->activity_information[j].Optional || !state->completed_tasks[i].activity_done[j]) { + for (int j = 0; j < p_task_data[taskID]->activity_count; j++) { + if (!p_task_data[taskID]->activity_information[j].Optional || !client_task_state->completed_tasks[i].activity_done[j]) { continue; } query = StringFormat( - completedTaskQuery, characterID, state->completed_tasks[i].completed_time, + completedTaskQuery, characterID, client_task_state->completed_tasks[i].completed_time, taskID, j ); results = database.QueryDatabase(query); @@ -465,7 +450,7 @@ bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) } } - state->last_completed_task_loaded = state->completed_tasks.size(); + client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); return true; } @@ -495,15 +480,15 @@ void Client::RemoveClientTaskState() } } -bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) +bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_state) { - if (!c || !state) { + if (!client || !client_task_state) { return false; } - int character_id = c->CharacterID(); + int character_id = client->CharacterID(); - state->active_task_count = 0; + client_task_state->active_task_count = 0; LogTasks("[LoadClientState] for character_id [{}]", character_id); @@ -529,7 +514,7 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) continue; } - auto task_info = state->GetClientTaskInfo(type, slot); + auto task_info = client_task_state->GetClientTaskInfo(type, slot); if (task_info == nullptr) { LogError("[TASKS] Slot [{}] out of range while loading character tasks from database", slot); @@ -553,7 +538,7 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) } if (type == TaskType::Quest) { - ++state->active_task_count; + ++client_task_state->active_task_count; } LogTasks("[LoadClientState] character_id [{}] task_id [{}] accepted_time [{}]", character_id, task_id, accepted_time); @@ -597,13 +582,13 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) } ClientTaskInformation *task_info = nullptr; - if (state->active_task.task_id == task_id) { - task_info = &state->active_task; + if (client_task_state->active_task.task_id == task_id) { + task_info = &client_task_state->active_task; } // wasn't task if (task_info == nullptr) { - for (auto & active_quest : state->active_quests) { + for (auto & active_quest : client_task_state->active_quests) { if (active_quest.task_id == task_id) { task_info = &active_quest; } @@ -684,7 +669,7 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) int completed_time = atoi(row[2]); if ((previous_task_id != -1) && ((task_id != previous_task_id) || (completed_time != previous_completed_time))) { - state->completed_tasks.push_back(completed_task_information); + client_task_state->completed_tasks.push_back(completed_task_information); for (bool & activity_done : completed_task_information.activity_done) { activity_done = false; } @@ -695,7 +680,7 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) // If activity_id is -1, Mark all the non-optional tasks as completed. if (activity_id < 0) { - TaskInformation *task = Tasks[task_id]; + TaskInformation *task = p_task_data[task_id]; if (task == nullptr) { continue; } @@ -712,10 +697,10 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) } if (previous_task_id != -1) { - state->completed_tasks.push_back(completed_task_information); + client_task_state->completed_tasks.push_back(completed_task_information); } - state->last_completed_task_loaded = state->completed_tasks.size(); + client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); } query = StringFormat( @@ -728,7 +713,7 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) if (results.Success()) { for (auto row = results.begin(); row != results.end(); ++row) { int task_id = atoi(row[0]); - state->enabled_tasks.push_back(task_id); + client_task_state->enabled_tasks.push_back(task_id); LogTasksDetail("[LoadClientState] Adding task_id [{}] to enabled tasks", task_id); } } @@ -737,12 +722,12 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) // This should only break if a ServerOP adds or deletes activites for a task that players already // have active, or due to a bug. for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - int task_id = state->ActiveTasks[i].task_id; + int task_id = client_task_state->ActiveTasks[i].task_id; if (task_id == TASKSLOTEMPTY) { continue; } - if (!Tasks[task_id]) { - c->Message( + if (!p_task_data[task_id]) { + client->Message( Chat::Red, "Active Task Slot %i, references a task (%i), that does not exist. " "Removing from memory. Contact a GM to resolve this.", @@ -750,16 +735,16 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) ); LogError("[LoadClientState] Character [{}] has task [{}] which does not exist", character_id, task_id); - state->ActiveTasks[i].task_id = TASKSLOTEMPTY; + client_task_state->ActiveTasks[i].task_id = TASKSLOTEMPTY; continue; } - for (int activity_index = 0; activity_index < Tasks[task_id]->activity_count; activity_index++) { - if (state->ActiveTasks[i].activity[activity_index].activity_id != activity_index) { - c->Message( + for (int activity_index = 0; activity_index < p_task_data[task_id]->activity_count; activity_index++) { + if (client_task_state->ActiveTasks[i].activity[activity_index].activity_id != activity_index) { + client->Message( Chat::Red, "Active Task %i, %s. activity_information count does not match expected value." "Removing from memory. Contact a GM to resolve this.", - task_id, Tasks[task_id]->title.c_str() + task_id, p_task_data[task_id]->title.c_str() ); LogTasks( @@ -768,20 +753,20 @@ bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) activity_index, task_id ); - state->ActiveTasks[i].task_id = TASKSLOTEMPTY; + client_task_state->ActiveTasks[i].task_id = TASKSLOTEMPTY; break; } } } - if (state->active_task.task_id != TASKSLOTEMPTY) { - state->UnlockActivities(character_id, state->active_task); + if (client_task_state->active_task.task_id != TASKSLOTEMPTY) { + client_task_state->UnlockActivities(character_id, client_task_state->active_task); } // TODO: shared - for (auto & active_quest : state->active_quests) { + for (auto & active_quest : client_task_state->active_quests) { if (active_quest.task_id != TASKSLOTEMPTY) { - state->UnlockActivities(character_id, active_quest); + client_task_state->UnlockActivities(character_id, active_quest); } } @@ -932,9 +917,9 @@ int ClientTaskState::EnabledTaskCount(int TaskSetID) if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { return -1; } - while ((EnabledTaskIndex < enabled_tasks.size()) && (TaskSetIndex < p_task_manager->TaskSets[TaskSetID].size())) { + while ((EnabledTaskIndex < enabled_tasks.size()) && (TaskSetIndex < p_task_manager->task_sets[TaskSetID].size())) { - if (enabled_tasks[EnabledTaskIndex] == p_task_manager->TaskSets[TaskSetID][TaskSetIndex]) { + if (enabled_tasks[EnabledTaskIndex] == p_task_manager->task_sets[TaskSetID][TaskSetIndex]) { EnabledTaskCount++; EnabledTaskIndex++; @@ -942,7 +927,7 @@ int ClientTaskState::EnabledTaskCount(int TaskSetID) continue; } - if (enabled_tasks[EnabledTaskIndex] < p_task_manager->TaskSets[TaskSetID][TaskSetIndex]) { + if (enabled_tasks[EnabledTaskIndex] < p_task_manager->task_sets[TaskSetID][TaskSetIndex]) { EnabledTaskIndex++; } else { @@ -961,8 +946,8 @@ int ClientTaskState::ActiveTasksInSet(int TaskSetID) int Count = 0; - for (unsigned int i = 0; i < p_task_manager->TaskSets[TaskSetID].size(); i++) - if (IsTaskActive(p_task_manager->TaskSets[TaskSetID][i])) { + for (unsigned int i = 0; i < p_task_manager->task_sets[TaskSetID].size(); i++) + if (IsTaskActive(p_task_manager->task_sets[TaskSetID][i])) { Count++; } @@ -977,8 +962,8 @@ int ClientTaskState::CompletedTasksInSet(int TaskSetID) int Count = 0; - for (unsigned int i = 0; i < p_task_manager->TaskSets[TaskSetID].size(); i++) - if (IsTaskCompleted(p_task_manager->TaskSets[TaskSetID][i])) { + for (unsigned int i = 0; i < p_task_manager->task_sets[TaskSetID].size(); i++) + if (IsTaskCompleted(p_task_manager->task_sets[TaskSetID][i])) { Count++; } @@ -1008,16 +993,16 @@ bool ClientTaskState::HasSlotForTask(TaskInformation *task) return false; } -int TaskManager::FirstTaskInSet(int TaskSetID) +int TaskManager::FirstTaskInSet(int task_set) { - if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { return 0; } + if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { return 0; } - if (TaskSets[TaskSetID].empty()) { return 0; } + if (task_sets[task_set].empty()) { return 0; } - auto Iterator = TaskSets[TaskSetID].begin(); + auto Iterator = task_sets[task_set].begin(); - while (Iterator != TaskSets[TaskSetID].end()) { + while (Iterator != task_sets[task_set].end()) { if ((*Iterator) > 0) { return (*Iterator); } @@ -1027,31 +1012,31 @@ int TaskManager::FirstTaskInSet(int TaskSetID) return 0; } -int TaskManager::LastTaskInSet(int TaskSetID) +int TaskManager::LastTaskInSet(int task_set) { - if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { + if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { return 0; } - if (TaskSets[TaskSetID].empty()) { + if (task_sets[task_set].empty()) { return 0; } - return TaskSets[TaskSetID][TaskSets[TaskSetID].size() - 1]; + return task_sets[task_set][task_sets[task_set].size() - 1]; } -int TaskManager::NextTaskInSet(int TaskSetID, int TaskID) +int TaskManager::NextTaskInSet(int task_set, int task_id) { - if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { + if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { return 0; } - if (TaskSets[TaskSetID].empty()) { + if (task_sets[task_set].empty()) { return 0; } - for (int i : TaskSets[TaskSetID]) { - if (i > TaskID) { + for (int i : task_sets[task_set]) { + if (i > task_id) { return i; } } @@ -1059,17 +1044,17 @@ int TaskManager::NextTaskInSet(int TaskSetID, int TaskID) return 0; } -bool TaskManager::ValidateLevel(int TaskID, int PlayerLevel) +bool TaskManager::ValidateLevel(int task_id, int player_level) { - if (Tasks[TaskID] == nullptr) { + if (p_task_data[task_id] == nullptr) { return false; } - if (Tasks[TaskID]->min_level && (PlayerLevel < Tasks[TaskID]->min_level)) { + if (p_task_data[task_id]->min_level && (player_level < p_task_data[task_id]->min_level)) { return false; } - if (Tasks[TaskID]->max_level && (PlayerLevel > Tasks[TaskID]->max_level)) { + if (p_task_data[task_id]->max_level && (player_level > p_task_data[task_id]->max_level)) { return false; } @@ -1079,8 +1064,8 @@ bool TaskManager::ValidateLevel(int TaskID, int PlayerLevel) std::string TaskManager::GetTaskName(uint32 task_id) { if (task_id > 0 && task_id < MAXTASKS) { - if (Tasks[task_id] != nullptr) { - return Tasks[task_id]->title; + if (p_task_data[task_id] != nullptr) { + return p_task_data[task_id]->title; } } @@ -1090,70 +1075,52 @@ std::string TaskManager::GetTaskName(uint32 task_id) TaskType TaskManager::GetTaskType(uint32 task_id) { if (task_id > 0 && task_id < MAXTASKS) { - if (Tasks[task_id] != nullptr) { - return Tasks[task_id]->type; + if (p_task_data[task_id] != nullptr) { + return p_task_data[task_id]->type; } } return TaskType::Task; } -int TaskManager::GetTaskMinLevel(int TaskID) -{ - if (Tasks[TaskID]->min_level) { - return Tasks[TaskID]->min_level; - } - - return -1; -} - -int TaskManager::GetTaskMaxLevel(int TaskID) -{ - if (Tasks[TaskID]->max_level) { - return Tasks[TaskID]->max_level; - } - - return -1; -} - -void TaskManager::TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, int TaskSetID) +void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int task_set_id) { int TaskList[MAXCHOOSERENTRIES]; int TaskListIndex = 0; - int PlayerLevel = c->GetLevel(); + int PlayerLevel = client->GetLevel(); - LogTasks("TaskSetSelector called for taskset [{}]. EnableTaskSize is [{}]", TaskSetID, state->enabled_tasks.size()); + LogTasks("TaskSetSelector called for taskset [{}]. EnableTaskSize is [{}]", task_set_id, client_task_state->enabled_tasks.size()); - if (TaskSetID <= 0 || TaskSetID >= MAXTASKSETS) { + if (task_set_id <= 0 || task_set_id >= MAXTASKSETS) { return; } - if (TaskSets[TaskSetID].empty()) { - mob->SayString(c, Chat::Yellow, MAX_ACTIVE_TASKS, c->GetName()); // I think this is suppose to be yellow + if (task_sets[task_set_id].empty()) { + mob->SayString(client, Chat::Yellow, MAX_ACTIVE_TASKS, client->GetName()); // I think this is suppose to be yellow return; } bool all_enabled = false; // A task_id of 0 in a TaskSet indicates that all Tasks in the set are enabled for all players. - if (TaskSets[TaskSetID][0] == 0) { - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSets[%i][0] == 0. All Tasks in Set enabled.", TaskSetID); + if (task_sets[task_set_id][0] == 0) { + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSets[%i][0] == 0. All Tasks in Set enabled.", task_set_id); all_enabled = true; } - auto Iterator = TaskSets[TaskSetID].begin(); + auto Iterator = task_sets[task_set_id].begin(); if (all_enabled) { ++Iterator; } // skip first when all enabled since it's useless data - while (Iterator != TaskSets[TaskSetID].end() && TaskListIndex < MAXCHOOSERENTRIES) { + while (Iterator != task_sets[task_set_id].end() && TaskListIndex < MAXCHOOSERENTRIES) { auto task = *Iterator; // verify level, we're not currently on it, repeatable status, if it's a (shared) task // we aren't currently on another, and if it's enabled if not all_enabled - if ((all_enabled || state->IsTaskEnabled(task)) && ValidateLevel(task, PlayerLevel) && - !state->IsTaskActive(task) && state->HasSlotForTask(Tasks[task]) && + if ((all_enabled || client_task_state->IsTaskEnabled(task)) && ValidateLevel(task, PlayerLevel) && + !client_task_state->IsTaskActive(task) && client_task_state->HasSlotForTask(p_task_data[task]) && // this slot checking is a bit silly, but we allow mixing of task types ... - (IsTaskRepeatable(task) || !state->IsTaskCompleted(task))) { + (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { TaskList[TaskListIndex++] = task; } @@ -1161,26 +1128,26 @@ void TaskManager::TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, i } if (TaskListIndex > 0) { - SendTaskSelector(c, mob, TaskListIndex, TaskList); + SendTaskSelector(client, mob, TaskListIndex, TaskList); } else { // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow mob->SayString( - c, + client, Chat::Yellow, MAX_ACTIVE_TASKS, - c->GetName() + client->GetName() ); } } // unlike the non-Quest version of this function, it does not check enabled, that is assumed the responsibility of the quest to handle // we do however still want it to check the other stuff like level, active, room, etc -void TaskManager::TaskQuestSetSelector(Client *c, ClientTaskState *state, Mob *mob, int count, int *tasks) +void TaskManager::TaskQuestSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int count, int *tasks) { int task_list[MAXCHOOSERENTRIES]; int task_list_index = 0; - int player_level = c->GetLevel(); + int player_level = client->GetLevel(); LogTasks("[UPDATE] TaskQuestSetSelector called for array size [{}]", count); @@ -1192,55 +1159,55 @@ void TaskManager::TaskQuestSetSelector(Client *c, ClientTaskState *state, Mob *m auto task = tasks[i]; // verify level, we're not currently on it, repeatable status, if it's a (shared) task // we aren't currently on another, and if it's enabled if not all_enabled - if (ValidateLevel(task, player_level) && !state->IsTaskActive(task) && state->HasSlotForTask(Tasks[task]) && + if (ValidateLevel(task, player_level) && !client_task_state->IsTaskActive(task) && client_task_state->HasSlotForTask(p_task_data[task]) && // this slot checking is a bit silly, but we allow mixing of task types ... - (IsTaskRepeatable(task) || !state->IsTaskCompleted(task))) { + (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { task_list[task_list_index++] = task; } } if (task_list_index > 0) { - SendTaskSelector(c, mob, task_list_index, task_list); + SendTaskSelector(client, mob, task_list_index, task_list); } else { // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow mob->SayString( - c, + client, Chat::Yellow, MAX_ACTIVE_TASKS, - c->GetName() + client->GetName() ); } } // sends task selector to client -void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *TaskList) +void TaskManager::SendTaskSelector(Client *client, Mob *mob, int task_count, int *task_list) { - if (c->ClientVersion() >= EQ::versions::ClientVersion::RoF) { - SendTaskSelectorNew(c, mob, TaskCount, TaskList); + if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF) { + SendTaskSelectorNew(client, mob, task_count, task_list); return; } // Titanium OpCode: 0x5e7c - LogTasks("TaskSelector for [{}] Tasks", TaskCount); - int PlayerLevel = c->GetLevel(); + LogTasks("TaskSelector for [{}] Tasks", task_count); + int PlayerLevel = client->GetLevel(); // Check if any of the tasks exist - for (int i = 0; i < TaskCount; i++) { - if (Tasks[TaskList[i]] != nullptr) { + for (int i = 0; i < task_count; i++) { + if (p_task_data[task_list[i]] != nullptr) { break; } } int ValidTasks = 0; - for (int i = 0; i < TaskCount; i++) { - if (!ValidateLevel(TaskList[i], PlayerLevel)) { + for (int i = 0; i < task_count; i++) { + if (!ValidateLevel(task_list[i], PlayerLevel)) { continue; } - if (c->IsTaskActive(TaskList[i])) { + if (client->IsTaskActive(task_list[i])) { continue; } - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) { + if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { continue; } @@ -1258,39 +1225,39 @@ void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *Task buf.WriteUInt32(2); // task type, live doesn't let you send more than one type, but we do? buf.WriteUInt32(mob->GetID()); - for (int i = 0; i < TaskCount; i++) { - if (!ValidateLevel(TaskList[i], PlayerLevel)) { + for (int i = 0; i < task_count; i++) { + if (!ValidateLevel(task_list[i], PlayerLevel)) { continue; } - if (c->IsTaskActive(TaskList[i])) { + if (client->IsTaskActive(task_list[i])) { continue; } - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) { + if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { continue; } - buf.WriteUInt32(TaskList[i]); // task_id + buf.WriteUInt32(task_list[i]); // task_id // affects color, difficulty? - if (c->ClientVersion() != EQ::versions::ClientVersion::Titanium) { + if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { buf.WriteFloat(1.0f); } - buf.WriteUInt32(Tasks[TaskList[i]]->duration); - buf.WriteUInt32(static_cast(Tasks[TaskList[i]]->duration_code)); + buf.WriteUInt32(p_task_data[task_list[i]]->duration); + buf.WriteUInt32(static_cast(p_task_data[task_list[i]]->duration_code)); - buf.WriteString(Tasks[TaskList[i]]->title); // max 64 with null - buf.WriteString(Tasks[TaskList[i]]->description); // max 4000 with null + buf.WriteString(p_task_data[task_list[i]]->title); // max 64 with null + buf.WriteString(p_task_data[task_list[i]]->description); // max 4000 with null // Has reward set flag - if (c->ClientVersion() != EQ::versions::ClientVersion::Titanium) { + if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { buf.WriteUInt8(0); } - buf.WriteUInt32(Tasks[TaskList[i]]->activity_count); + buf.WriteUInt32(p_task_data[task_list[i]]->activity_count); - for (int j = 0; j < Tasks[TaskList[i]]->activity_count; ++j) { + for (int j = 0; j < p_task_data[task_list[i]]->activity_count; ++j) { buf.WriteUInt32(j); // ActivityNumber - auto &activity = Tasks[TaskList[i]]->activity_information[j]; + auto &activity = p_task_data[task_list[i]]->activity_information[j]; buf.WriteUInt32(activity.Type); buf.WriteUInt32(0); // solo, group, raid? buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) @@ -1305,33 +1272,33 @@ void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *Task auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf); - c->QueuePacket(outapp); + client->QueuePacket(outapp); safe_delete(outapp); } -void TaskManager::SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *TaskList) +void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, int *task_list) { - LogTasks("SendTaskSelectorNew for [{}] Tasks", TaskCount); + LogTasks("SendTaskSelectorNew for [{}] Tasks", task_count); - int PlayerLevel = c->GetLevel(); + int PlayerLevel = client->GetLevel(); // Check if any of the tasks exist - for (int i = 0; i < TaskCount; i++) { - if (Tasks[TaskList[i]] != nullptr) { + for (int i = 0; i < task_count; i++) { + if (p_task_data[task_list[i]] != nullptr) { break; } } int ValidTasks = 0; - for (int i = 0; i < TaskCount; i++) { - if (!ValidateLevel(TaskList[i], PlayerLevel)) { + for (int i = 0; i < task_count; i++) { + if (!ValidateLevel(task_list[i], PlayerLevel)) { continue; } - if (c->IsTaskActive(TaskList[i])) { + if (client->IsTaskActive(task_list[i])) { continue; } - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) { + if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { continue; } @@ -1350,31 +1317,31 @@ void TaskManager::SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *T // this is also sent in OP_TaskDescription buf.WriteUInt32(mob->GetID()); // TaskGiver - for (int i = 0; i < TaskCount; i++) { // max 40 - if (!ValidateLevel(TaskList[i], PlayerLevel)) { + for (int i = 0; i < task_count; i++) { // max 40 + if (!ValidateLevel(task_list[i], PlayerLevel)) { continue; } - if (c->IsTaskActive(TaskList[i])) { + if (client->IsTaskActive(task_list[i])) { continue; } - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) { + if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { continue; } - buf.WriteUInt32(TaskList[i]); // task_id + buf.WriteUInt32(task_list[i]); // task_id buf.WriteFloat(1.0f); // affects color, difficulty? - buf.WriteUInt32(Tasks[TaskList[i]]->duration); - buf.WriteUInt32(static_cast(Tasks[TaskList[i]]->duration_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited + buf.WriteUInt32(p_task_data[task_list[i]]->duration); + buf.WriteUInt32(static_cast(p_task_data[task_list[i]]->duration_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited - buf.WriteString(Tasks[TaskList[i]]->title); // max 64 with null - buf.WriteString(Tasks[TaskList[i]]->description); // max 4000 with null + buf.WriteString(p_task_data[task_list[i]]->title); // max 64 with null + buf.WriteString(p_task_data[task_list[i]]->description); // max 4000 with null buf.WriteUInt8(0); // Has reward set flag - buf.WriteUInt32(Tasks[TaskList[i]]->activity_count); // activity_count + buf.WriteUInt32(p_task_data[task_list[i]]->activity_count); // activity_count - for (int j = 0; j < Tasks[TaskList[i]]->activity_count; ++j) { + for (int j = 0; j < p_task_data[task_list[i]]->activity_count; ++j) { buf.WriteUInt32(j); // ActivityNumber - auto &activity = Tasks[TaskList[i]]->activity_information[j]; + auto &activity = p_task_data[task_list[i]]->activity_information[j]; buf.WriteUInt32(activity.Type); // ActivityType buf.WriteUInt32(0); // solo, group, raid? buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) @@ -1400,24 +1367,24 @@ void TaskManager::SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *T auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf); - c->QueuePacket(outapp); + client->QueuePacket(outapp); safe_delete(outapp); } -int TaskManager::GetActivityCount(int TaskID) +int TaskManager::GetActivityCount(int task_id) { // Return the total number of activities in a particular task. - if ((TaskID > 0) && (TaskID < MAXTASKS)) { - if (Tasks[TaskID]) { return Tasks[TaskID]->activity_count; } + if ((task_id > 0) && (task_id < MAXTASKS)) { + if (p_task_data[task_id]) { return p_task_data[task_id]->activity_count; } } return 0; } -void TaskManager::ExplainTask(Client *c, int TaskID) +void TaskManager::ExplainTask(Client *client, int task_id) { // TODO: This method is not finished (hardly started). It was intended to @@ -1425,27 +1392,27 @@ void TaskManager::ExplainTask(Client *c, int TaskID) // return; - if (!c) { return; } + if (!client) { return; } - if ((TaskID <= 0) || (TaskID >= MAXTASKS)) { - c->Message(Chat::White, "task_id out-of-range."); + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + client->Message(Chat::White, "task_id out-of-range."); return; } - if (Tasks[TaskID] == nullptr) { - c->Message(Chat::White, "Task does not exist."); + if (p_task_data[task_id] == nullptr) { + client->Message(Chat::White, "Task does not exist."); return; } char explanation[1000], *ptr; - c->Message(Chat::White, "Task %4i: title: %s", TaskID, Tasks[TaskID]->description.c_str()); - c->Message(Chat::White, "%3i Activities", Tasks[TaskID]->activity_count); + client->Message(Chat::White, "Task %4i: title: %s", task_id, p_task_data[task_id]->description.c_str()); + client->Message(Chat::White, "%3i Activities", p_task_data[task_id]->activity_count); ptr = explanation; - for (int i = 0; i < Tasks[TaskID]->activity_count; i++) { + for (int i = 0; i < p_task_data[task_id]->activity_count; i++) { sprintf(ptr, "Act: %3i: ", i); ptr = ptr + strlen(ptr); - switch (Tasks[TaskID]->activity_information[i].Type) { + switch (p_task_data[task_id]->activity_information[i].Type) { case ActivityDeliver: sprintf(ptr, "Deliver"); break; @@ -1500,7 +1467,7 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & { bool all_activities_complete = true; - TaskInformation *p_task_information = p_task_manager->Tasks[task_info.task_id]; + TaskInformation *p_task_information = p_task_manager->p_task_data[task_info.task_id]; if (p_task_information == nullptr) { return true; } @@ -1693,7 +1660,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *c, int activity_type, int npc_typ } // Check if there are any active kill activities for this p_task_information - auto p_task_information = p_task_manager->Tasks[current_task->task_id]; + auto p_task_information = p_task_manager->p_task_data[current_task->task_id]; if (p_task_information == nullptr) { return false; } @@ -1728,7 +1695,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *c, int activity_type, int npc_typ break; case METHODLIST: - if (!p_task_manager->GoalListManager.IsInList(p_task_information->activity_information[activity_id].GoalID, npc_type_id)) { + if (!p_task_manager->goal_list_manager.IsInList(p_task_information->activity_information[activity_id].GoalID, npc_type_id)) { continue; } break; @@ -1763,7 +1730,7 @@ int ClientTaskState::ActiveSpeakTask(int npc_type_id) continue; } - TaskInformation *p_task_information = p_task_manager->Tasks[current_task->task_id]; + TaskInformation *p_task_information = p_task_manager->p_task_data[current_task->task_id]; if (p_task_information == nullptr) { continue; } @@ -1808,7 +1775,7 @@ int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) continue; } - TaskInformation *p_task_information = p_task_manager->Tasks[current_task->task_id]; + TaskInformation *p_task_information = p_task_manager->p_task_data[current_task->task_id]; if (p_task_information == nullptr) { continue; } @@ -1861,7 +1828,7 @@ void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemI // Check if there are any active loot activities for this task - TaskInformation *Task = p_task_manager->Tasks[cur_task->task_id]; + TaskInformation *Task = p_task_manager->p_task_data[cur_task->task_id]; if (Task == nullptr) { return; @@ -1891,7 +1858,7 @@ void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemI break; case METHODLIST: - if (!p_task_manager->GoalListManager.IsInList(Task->activity_information[j].GoalID, ItemID)) { continue; } + if (!p_task_manager->goal_list_manager.IsInList(Task->activity_information[j].GoalID, ItemID)) { continue; } break; default: @@ -1926,7 +1893,7 @@ void ClientTaskState::UpdateTasksOnExplore(Client *c, int ExploreID) // Check if there are any active explore activities for this task - TaskInformation *Task = p_task_manager->Tasks[cur_task->task_id]; + TaskInformation *Task = p_task_manager->p_task_data[cur_task->task_id]; if (Task == nullptr) { return; @@ -1957,7 +1924,7 @@ void ClientTaskState::UpdateTasksOnExplore(Client *c, int ExploreID) break; case METHODLIST: - if (!p_task_manager->GoalListManager.IsInList(Task->activity_information[j].GoalID, ExploreID)) { + if (!p_task_manager->goal_list_manager.IsInList(Task->activity_information[j].GoalID, ExploreID)) { continue; } break; @@ -1998,7 +1965,7 @@ bool ClientTaskState::UpdateTasksOnDeliver(Client *c, std::listTasks[cur_task->task_id]; + TaskInformation *Task = p_task_manager->p_task_data[cur_task->task_id]; if (Task == nullptr) { return false; @@ -2043,7 +2010,7 @@ bool ClientTaskState::UpdateTasksOnDeliver(Client *c, std::listGoalListManager.IsInList( + if (!p_task_manager->goal_list_manager.IsInList( Task->activity_information[j].GoalID, k->GetID())) { continue; @@ -2084,7 +2051,7 @@ void ClientTaskState::UpdateTasksOnTouch(Client *c, int ZoneID) // Check if there are any active explore activities for this task - TaskInformation *Task = p_task_manager->Tasks[cur_task->task_id]; + TaskInformation *Task = p_task_manager->p_task_data[cur_task->task_id]; if (Task == nullptr) { return; @@ -2121,22 +2088,22 @@ void ClientTaskState::UpdateTasksOnTouch(Client *c, int ZoneID) } void ClientTaskState::IncrementDoneCount( - Client *c, TaskInformation *Task, int TaskIndex, int ActivityID, int Count, + Client *client, TaskInformation *task_information, int task_index, int activity_id, int count, bool ignore_quest_update ) { Log(Logs::General, Logs::Tasks, "[UPDATE] IncrementDoneCount"); - auto info = GetClientTaskInfo(Task->type, TaskIndex); + auto info = GetClientTaskInfo(task_information->type, task_index); if (info == nullptr) { return; } - info->activity[ActivityID].done_count += Count; + info->activity[activity_id].done_count += count; - if (info->activity[ActivityID].done_count > Task->activity_information[ActivityID].GoalCount) { - info->activity[ActivityID].done_count = Task->activity_information[ActivityID].GoalCount; + if (info->activity[activity_id].done_count > task_information->activity_information[activity_id].GoalCount) { + info->activity[activity_id].done_count = task_information->activity_information[activity_id].GoalCount; } if (!ignore_quest_update) { @@ -2145,51 +2112,51 @@ void ClientTaskState::IncrementDoneCount( buf, 23, "%d %d %d", - info->activity[ActivityID].done_count, - info->activity[ActivityID].activity_id, + info->activity[activity_id].done_count, + info->activity[activity_id].activity_id, info->task_id ); buf[23] = '\0'; - parse->EventPlayer(EVENT_TASK_UPDATE, c, buf, 0); + parse->EventPlayer(EVENT_TASK_UPDATE, client, buf, 0); } - info->activity[ActivityID].updated = true; + info->activity[activity_id].updated = true; // Have we reached the goal count for this activity_information ? - if (info->activity[ActivityID].done_count >= Task->activity_information[ActivityID].GoalCount) { + if (info->activity[activity_id].done_count >= task_information->activity_information[activity_id].GoalCount) { Log(Logs::General, Logs::Tasks, "[UPDATE] Done (%i) = Goal (%i) for activity_information %i", - info->activity[ActivityID].done_count, - Task->activity_information[ActivityID].GoalCount, - ActivityID); + info->activity[activity_id].done_count, + task_information->activity_information[activity_id].GoalCount, + activity_id); // Flag the activity_information as complete - info->activity[ActivityID].activity_state = ActivityCompleted; + info->activity[activity_id].activity_state = ActivityCompleted; // Unlock subsequent activities for this task - bool TaskComplete = UnlockActivities(c->CharacterID(), *info); + bool TaskComplete = UnlockActivities(client->CharacterID(), *info); Log(Logs::General, Logs::Tasks, "[UPDATE] TaskCompleted is %i", TaskComplete); // and by the 'Task Stage Completed' message - c->SendTaskActivityComplete(info->task_id, ActivityID, TaskIndex, Task->type); + client->SendTaskActivityComplete(info->task_id, activity_id, task_index, task_information->type); // Send the updated task/activity_information list to the client - p_task_manager->SendSingleActiveTaskToClient(c, *info, TaskComplete, false); + p_task_manager->SendSingleActiveTaskToClient(client, *info, TaskComplete, false); // Inform the client the task has been updated, both by a chat message - c->Message(Chat::White, "Your task '%s' has been updated.", Task->title.c_str()); + client->Message(Chat::White, "Your task '%s' has been updated.", task_information->title.c_str()); - if (Task->activity_information[ActivityID].GoalMethod != METHODQUEST) { + if (task_information->activity_information[activity_id].GoalMethod != METHODQUEST) { if (!ignore_quest_update) { char buf[24]; - snprintf(buf, 23, "%d %d", info->task_id, info->activity[ActivityID].activity_id); + snprintf(buf, 23, "%d %d", info->task_id, info->activity[activity_id].activity_id); buf[23] = '\0'; - parse->EventPlayer(EVENT_TASK_STAGE_COMPLETE, c, buf, 0); + parse->EventPlayer(EVENT_TASK_STAGE_COMPLETE, client, buf, 0); } /* QS: PlayerLogTaskUpdates :: Update */ if (RuleB(QueryServ, PlayerLogTaskUpdates)) { std::string event_desc = StringFormat( "Task Stage Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", info->task_id, - info->activity[ActivityID].activity_id, - info->activity[ActivityID].done_count, - c->GetZoneID(), - c->GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_Task_Updates, c->CharacterID(), event_desc); + info->activity[activity_id].activity_id, + info->activity[activity_id].done_count, + client->GetZoneID(), + client->GetInstanceID()); + QServ->PlayerLogEvent(Player_Log_Task_Updates, client->CharacterID(), event_desc); } } @@ -2202,33 +2169,33 @@ void ClientTaskState::IncrementDoneCount( buf, 23, "%d %d %d", - info->activity[ActivityID].done_count, - info->activity[ActivityID].activity_id, + info->activity[activity_id].done_count, + info->activity[activity_id].activity_id, info->task_id ); buf[23] = '\0'; - parse->EventPlayer(EVENT_TASK_COMPLETE, c, buf, 0); + parse->EventPlayer(EVENT_TASK_COMPLETE, client, buf, 0); /* QS: PlayerLogTaskUpdates :: Complete */ if (RuleB(QueryServ, PlayerLogTaskUpdates)) { std::string event_desc = StringFormat( "Task Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", info->task_id, - info->activity[ActivityID].activity_id, - info->activity[ActivityID].done_count, - c->GetZoneID(), - c->GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_Task_Updates, c->CharacterID(), event_desc); + info->activity[activity_id].activity_id, + info->activity[activity_id].done_count, + client->GetZoneID(), + client->GetInstanceID()); + QServ->PlayerLogEvent(Player_Log_Task_Updates, client->CharacterID(), event_desc); } - p_task_manager->SendCompletedTasksToClient(c, this); - c->SendTaskActivityComplete(info->task_id, 0, TaskIndex, Task->type, 0); - p_task_manager->SaveClientState(c, this); + p_task_manager->SendCompletedTasksToClient(client, this); + client->SendTaskActivityComplete(info->task_id, 0, task_index, task_information->type, 0); + p_task_manager->SaveClientState(client, this); //c->SendTaskComplete(TaskIndex); - c->CancelTask(TaskIndex, Task->type); + client->CancelTask(task_index, task_information->type); //if(Task->reward_method != METHODQUEST) RewardTask(c, Task); // If Experience and/or cash rewards are set, reward them from the task even if reward_method is METHODQUEST - RewardTask(c, Task); + RewardTask(client, task_information); //RemoveTask(c, TaskIndex); } @@ -2237,10 +2204,10 @@ void ClientTaskState::IncrementDoneCount( else { // Send an updated packet for this single activity_information p_task_manager->SendTaskActivityLong( - c, info->task_id, ActivityID, TaskIndex, - Task->activity_information[ActivityID].Optional + client, info->task_id, activity_id, task_index, + task_information->activity_information[activity_id].Optional ); - p_task_manager->SaveClientState(c, this); + p_task_manager->SaveClientState(client, this); } } @@ -2265,7 +2232,7 @@ void ClientTaskState::RewardTask(Client *c, TaskInformation *Task) break; } case METHODLIST: { - RewardList = p_task_manager->GoalListManager.GetListContents(Task->reward_id); + RewardList = p_task_manager->goal_list_manager.GetListContents(Task->reward_id); for (unsigned int i = 0; i < RewardList.size(); i++) { c->SummonItem(RewardList[i]); Item = database.GetItem(RewardList[i]); @@ -2449,7 +2416,7 @@ bool ClientTaskState::IsTaskActivityActive(int TaskID, int ActivityID) return false; } - TaskInformation *Task = p_task_manager->Tasks[info->task_id]; + TaskInformation *Task = p_task_manager->p_task_data[info->task_id]; // The task is invalid if (Task == nullptr) { @@ -2511,7 +2478,7 @@ void ClientTaskState::UpdateTaskActivity( return; } - TaskInformation *Task = p_task_manager->Tasks[info->task_id]; + TaskInformation *Task = p_task_manager->p_task_data[info->task_id]; // The task is invalid if (Task == nullptr) { @@ -2569,7 +2536,7 @@ void ClientTaskState::ResetTaskActivity(Client *c, int TaskID, int ActivityID) return; } - TaskInformation *Task = p_task_manager->Tasks[info->task_id]; + TaskInformation *Task = p_task_manager->p_task_data[info->task_id]; // The task is invalid if (Task == nullptr) { @@ -2594,8 +2561,8 @@ void ClientTaskState::ShowClientTasks(Client *c) { c->Message(Chat::White, "Task Information:"); if (active_task.task_id != TASKSLOTEMPTY) { - c->Message(Chat::White, "Task: %i %s", active_task.task_id, p_task_manager->Tasks[active_task.task_id]->title.c_str()); - c->Message(Chat::White, " description: [%s]\n", p_task_manager->Tasks[active_task.task_id]->description.c_str()); + c->Message(Chat::White, "Task: %i %s", active_task.task_id, p_task_manager->p_task_data[active_task.task_id]->title.c_str()); + c->Message(Chat::White, " description: [%s]\n", p_task_manager->p_task_data[active_task.task_id]->description.c_str()); for (int j = 0; j < p_task_manager->GetActivityCount(active_task.task_id); j++) { c->Message( Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", @@ -2612,11 +2579,11 @@ void ClientTaskState::ShowClientTasks(Client *c) c->Message( Chat::White, "Quest: %i %s", active_quests[i].task_id, - p_task_manager->Tasks[active_quests[i].task_id]->title.c_str()); + p_task_manager->p_task_data[active_quests[i].task_id]->title.c_str()); c->Message( Chat::White, " description: [%s]\n", - p_task_manager->Tasks[active_quests[i].task_id]->description.c_str()); + p_task_manager->p_task_data[active_quests[i].task_id]->description.c_str()); for (int j = 0; j < p_task_manager->GetActivityCount(active_quests[i].task_id); j++) { c->Message( Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", @@ -2633,7 +2600,7 @@ int ClientTaskState::TaskTimeLeft(int TaskID) if (active_task.task_id == TaskID) { int Now = time(nullptr); - TaskInformation *Task = p_task_manager->Tasks[TaskID]; + TaskInformation *Task = p_task_manager->p_task_data[TaskID]; if (Task == nullptr) { return -1; @@ -2660,7 +2627,7 @@ int ClientTaskState::TaskTimeLeft(int TaskID) int Now = time(nullptr); - TaskInformation *Task = p_task_manager->Tasks[active_quests[i].task_id]; + TaskInformation *Task = p_task_manager->p_task_data[active_quests[i].task_id]; if (Task == nullptr) { return -1; @@ -2701,12 +2668,12 @@ int ClientTaskState::IsTaskCompleted(int TaskID) return 0; } -bool TaskManager::IsTaskRepeatable(int TaskID) +bool TaskManager::IsTaskRepeatable(int task_id) { - if ((TaskID <= 0) || (TaskID >= MAXTASKS)) { return false; } + if ((task_id <= 0) || (task_id >= MAXTASKS)) { return false; } - TaskInformation *Task = p_task_manager->Tasks[TaskID]; + TaskInformation *Task = p_task_manager->p_task_data[task_id]; if (Task == nullptr) { return false; } @@ -2729,7 +2696,7 @@ bool ClientTaskState::TaskOutOfTime(TaskType type, int Index) int Now = time(nullptr); - TaskInformation *Task = p_task_manager->Tasks[info->task_id]; + TaskInformation *Task = p_task_manager->p_task_data[info->task_id]; if (Task == nullptr) { return false; @@ -2837,7 +2804,7 @@ void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) if ((TaskID < 0) || (TaskID > MAXTASKS)) { return; } - TaskInformation *Task = p_task_manager->Tasks[TaskID]; + TaskInformation *Task = p_task_manager->p_task_data[TaskID]; if (Task == nullptr) { return; } @@ -2948,7 +2915,7 @@ void Client::SendTaskFailed(int task_id, int task_index, TaskType task_type) safe_delete(outapp); } -void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) +void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *client_task_state) { int PacketLength = 4; @@ -2959,14 +2926,14 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) // The client only display the first 50 Completed Tasks send, so send the 50 most recent int FirstTaskToSend = 0; - int LastTaskToSend = State->completed_tasks.size(); + int LastTaskToSend = client_task_state->completed_tasks.size(); - if (State->completed_tasks.size() > 50) { - FirstTaskToSend = State->completed_tasks.size() - 50; + if (client_task_state->completed_tasks.size() > 50) { + FirstTaskToSend = client_task_state->completed_tasks.size() - 50; } Log(Logs::General, Logs::Tasks, "[UPDATE] Completed Task Count: %i, First Task to send is %i, Last is %i", - State->completed_tasks.size(), FirstTaskToSend, LastTaskToSend); + client_task_state->completed_tasks.size(), FirstTaskToSend, LastTaskToSend); /* for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { int task_id = (*iterator).task_id; @@ -2975,9 +2942,9 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) } */ for (int i = FirstTaskToSend; i < LastTaskToSend; i++) { - int TaskID = State->completed_tasks[i].task_id; - if (Tasks[TaskID] == nullptr) { continue; } - PacketLength = PacketLength + 8 + Tasks[TaskID]->title.size() + 1; + int TaskID = client_task_state->completed_tasks[i].task_id; + if (p_task_data[TaskID] == nullptr) { continue; } + PacketLength = PacketLength + 8 + p_task_data[TaskID]->title.size() + 1; } auto outapp = new EQApplicationPacket(OP_CompletedTasks, PacketLength); @@ -2989,15 +2956,15 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) //for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { // int task_id = (*iterator).task_id; for (int i = FirstTaskToSend; i < LastTaskToSend; i++) { - int TaskID = State->completed_tasks[i].task_id; - if (Tasks[TaskID] == nullptr) { continue; } + int TaskID = client_task_state->completed_tasks[i].task_id; + if (p_task_data[TaskID] == nullptr) { continue; } *(uint32 *) buf = TaskID; buf = buf + 4; - sprintf(buf, "%s", Tasks[TaskID]->title.c_str()); + sprintf(buf, "%s", p_task_data[TaskID]->title.c_str()); buf = buf + strlen(buf) + 1; //*(uint32 *)buf = (*iterator).CompletedTime; - *(uint32 *) buf = State->completed_tasks[i].completed_time; + *(uint32 *) buf = client_task_state->completed_tasks[i].completed_time; buf = buf + 4; } @@ -3007,23 +2974,23 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) } -void TaskManager::SendTaskActivityShort(Client *c, int TaskID, int ActivityID, int ClientTaskIndex) +void TaskManager::SendTaskActivityShort(Client *client, int task_id, int activity_id, int client_task_index) { // This activity_information Packet is sent for activities that have not yet been unlocked and appear as ??? // in the client. TaskActivityShort_Struct *tass; - if (c->ClientVersionBit() & EQ::versions::maskRoFAndLater) { + if (client->ClientVersionBit() & EQ::versions::maskRoFAndLater) { auto outapp = new EQApplicationPacket(OP_TaskActivity, 25); - outapp->WriteUInt32(ClientTaskIndex); - outapp->WriteUInt32(static_cast(Tasks[TaskID]->type)); - outapp->WriteUInt32(TaskID); - outapp->WriteUInt32(ActivityID); + outapp->WriteUInt32(client_task_index); + outapp->WriteUInt32(static_cast(p_task_data[task_id]->type)); + outapp->WriteUInt32(task_id); + outapp->WriteUInt32(activity_id); outapp->WriteUInt32(0); outapp->WriteUInt32(0xffffffff); outapp->WriteUInt8(0); - c->FastQueuePacket(&outapp); + client->FastQueuePacket(&outapp); return; } @@ -3032,60 +2999,60 @@ void TaskManager::SendTaskActivityShort(Client *c, int TaskID, int ActivityID, i tass = (TaskActivityShort_Struct *) outapp->pBuffer; - tass->TaskSequenceNumber = ClientTaskIndex; - tass->unknown2 = static_cast(Tasks[TaskID]->type); - tass->TaskID = TaskID; - tass->ActivityID = ActivityID; + tass->TaskSequenceNumber = client_task_index; + tass->unknown2 = static_cast(p_task_data[task_id]->type); + tass->TaskID = task_id; + tass->ActivityID = activity_id; tass->unknown3 = 0x000000; tass->ActivityType = 0xffffffff; tass->unknown4 = 0x00000000; - c->QueuePacket(outapp); + client->QueuePacket(outapp); safe_delete(outapp); } void TaskManager::SendTaskActivityLong( - Client *c, - int TaskID, - int ActivityID, - int ClientTaskIndex, - bool Optional, - bool TaskComplete + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete ) { - if (c->ClientVersion() >= EQ::versions::ClientVersion::RoF) { - SendTaskActivityNew(c, TaskID, ActivityID, ClientTaskIndex, Optional, TaskComplete); + if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF) { + SendTaskActivityNew(client, task_id, activity_id, client_task_index, optional, task_complete); return; } SerializeBuffer buf(100); - buf.WriteUInt32(ClientTaskIndex); - buf.WriteUInt32(static_cast(Tasks[TaskID]->type)); - buf.WriteUInt32(TaskID); - buf.WriteUInt32(ActivityID); + buf.WriteUInt32(client_task_index); + buf.WriteUInt32(static_cast(p_task_data[task_id]->type)); + buf.WriteUInt32(task_id); + buf.WriteUInt32(activity_id); buf.WriteUInt32(0); // unknown3 // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes // no difference to the client. All activity_information updates will be done based on our interal activity_information types. - if ((Tasks[TaskID]->activity_information[ActivityID].Type > 0) && Tasks[TaskID]->activity_information[ActivityID].Type < 100) { - buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].Type); + if ((p_task_data[task_id]->activity_information[activity_id].Type > 0) && p_task_data[task_id]->activity_information[activity_id].Type < 100) { + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].Type); } else { buf.WriteUInt32(ActivityCastOn); } // w/e! - buf.WriteUInt32(Optional); + buf.WriteUInt32(optional); buf.WriteUInt32(0); // solo, group, raid - buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].target_name); // target name string - buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].item_list); // item name list + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].target_name); // target name string + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].item_list); // item name list - if (Tasks[TaskID]->activity_information[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].GoalCount); + if (p_task_data[task_id]->activity_information[activity_id].Type != ActivityGiveCash) + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].GoalCount); else // For our internal type GiveCash, where the goal count has the amount of cash that must be given, // we don't want the donecount and goalcount fields cluttered up with potentially large numbers, so we just @@ -3093,144 +3060,144 @@ void TaskManager::SendTaskActivityLong( // The text3 field should decribe the exact activity_information goal, e.g. give 3500gp to Hasten Bootstrutter. buf.WriteUInt32(1); - buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].skill_id); - buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].spell_id); + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].skill_id); + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].spell_id); buf.WriteUInt32( - Tasks[TaskID]->activity_information[ActivityID].ZoneIDs.empty() ? 0 : Tasks[TaskID]->activity_information[ActivityID].ZoneIDs.front()); + p_task_data[task_id]->activity_information[activity_id].ZoneIDs.empty() ? 0 : p_task_data[task_id]->activity_information[activity_id].ZoneIDs.front()); buf.WriteUInt32(0); - buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].desc_override); + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].desc_override); - if (Tasks[TaskID]->activity_information[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID)); + if (p_task_data[task_id]->activity_information[activity_id].Type != ActivityGiveCash) + buf.WriteUInt32(client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id)); else // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. - buf.WriteUInt32((c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID) >= - Tasks[TaskID]->activity_information[ActivityID].GoalCount)); + buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= + p_task_data[task_id]->activity_information[activity_id].GoalCount)); buf.WriteUInt32(1); // unknown auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); - c->QueuePacket(outapp); + client->QueuePacket(outapp); safe_delete(outapp); } // Used only by RoF+ Clients void TaskManager::SendTaskActivityNew( - Client *c, - int TaskID, - int ActivityID, - int ClientTaskIndex, - bool Optional, - bool TaskComplete + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete ) { SerializeBuffer buf(100); - buf.WriteUInt32(ClientTaskIndex); // TaskSequenceNumber - buf.WriteUInt32(static_cast(Tasks[TaskID]->type)); // task type - buf.WriteUInt32(TaskID); - buf.WriteUInt32(ActivityID); + buf.WriteUInt32(client_task_index); // TaskSequenceNumber + buf.WriteUInt32(static_cast(p_task_data[task_id]->type)); // task type + buf.WriteUInt32(task_id); + buf.WriteUInt32(activity_id); buf.WriteUInt32(0); // unknown3 // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes // no difference to the client. All activity_information updates will be done based on our interal activity_information types. - if ((Tasks[TaskID]->activity_information[ActivityID].Type > 0) && Tasks[TaskID]->activity_information[ActivityID].Type < 100) { - buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].Type); + if ((p_task_data[task_id]->activity_information[activity_id].Type > 0) && p_task_data[task_id]->activity_information[activity_id].Type < 100) { + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].Type); } else { buf.WriteUInt32(ActivityCastOn); } // w/e! - buf.WriteUInt8(Optional); + buf.WriteUInt8(optional); buf.WriteUInt32(0); // solo, group, raid // One of these unknown fields maybe related to the 'Use On' activity_information types - buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].target_name); // target name string + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].target_name); // target name string - buf.WriteLengthString(Tasks[TaskID]->activity_information[ActivityID].item_list); // item name list + buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].item_list); // item name list // Goal Count - if (Tasks[TaskID]->activity_information[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(Tasks[TaskID]->activity_information[ActivityID].GoalCount); + if (p_task_data[task_id]->activity_information[activity_id].Type != ActivityGiveCash) + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].GoalCount); else buf.WriteUInt32(1); // GoalCount // skill ID list ; separated - buf.WriteLengthString(Tasks[TaskID]->activity_information[ActivityID].skill_list); + buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].skill_list); // spelll ID list ; separated -- unsure wtf we're doing here - buf.WriteLengthString(Tasks[TaskID]->activity_information[ActivityID].spell_list); + buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].spell_list); - buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].zones); + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].zones); buf.WriteUInt32(0); // unknown7 - buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].desc_override); // description override + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].desc_override); // description override - if (Tasks[TaskID]->activity_information[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID)); // done_count + if (p_task_data[task_id]->activity_information[activity_id].Type != ActivityGiveCash) + buf.WriteUInt32(client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id)); // done_count else // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. - buf.WriteUInt32((c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID) >= - Tasks[TaskID]->activity_information[ActivityID].GoalCount)); + buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= + p_task_data[task_id]->activity_information[activity_id].GoalCount)); buf.WriteUInt8(1); // unknown9 - buf.WriteString(Tasks[TaskID]->activity_information[ActivityID].zones); + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].zones); auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); - c->QueuePacket(outapp); + client->QueuePacket(outapp); safe_delete(outapp); } -void TaskManager::SendActiveTasksToClient(Client *c, bool TaskComplete) +void TaskManager::SendActiveTasksToClient(Client *client, bool task_complete) { - auto state = c->GetTaskState(); + auto state = client->GetTaskState(); if (!state) { return; } for (int TaskIndex = 0; TaskIndex < MAXACTIVEQUESTS + 1; TaskIndex++) { int TaskID = state->ActiveTasks[TaskIndex].task_id; - if ((TaskID == 0) || (Tasks[TaskID] == 0)) { + if ((TaskID == 0) || (p_task_data[TaskID] == 0)) { continue; } int StartTime = state->ActiveTasks[TaskIndex].accepted_time; SendActiveTaskDescription( - c, TaskID, state->ActiveTasks[TaskIndex], StartTime, Tasks[TaskID]->duration, + client, TaskID, state->ActiveTasks[TaskIndex], StartTime, p_task_data[TaskID]->duration, false ); Log(Logs::General, Logs::Tasks, "[UPDATE] SendActiveTasksToClient: Task %i, Activities: %i", TaskID, GetActivityCount(TaskID)); int Sequence = 0; - int fixed_index = Tasks[TaskID]->type == TaskType::Task ? 0 : TaskIndex - 1; // hmmm fuck + int fixed_index = p_task_data[TaskID]->type == TaskType::Task ? 0 : TaskIndex - 1; // hmmm fuck for (int Activity = 0; Activity < GetActivityCount(TaskID); Activity++) { - if (c->GetTaskActivityState(Tasks[TaskID]->type, fixed_index, Activity) != ActivityHidden) { + if (client->GetTaskActivityState(p_task_data[TaskID]->type, fixed_index, Activity) != ActivityHidden) { Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i, %i Complete=%i", TaskID, - Activity, fixed_index, TaskComplete); + Activity, fixed_index, task_complete); if (Activity == GetActivityCount(TaskID) - 1) { SendTaskActivityLong( - c, TaskID, Activity, fixed_index, - Tasks[TaskID]->activity_information[Activity].Optional, TaskComplete + client, TaskID, Activity, fixed_index, + p_task_data[TaskID]->activity_information[Activity].Optional, task_complete ); } else { SendTaskActivityLong( - c, TaskID, Activity, fixed_index, - Tasks[TaskID]->activity_information[Activity].Optional, 0 + client, TaskID, Activity, fixed_index, + p_task_data[TaskID]->activity_information[Activity].Optional, 0 ); } } else { Log(Logs::General, Logs::Tasks, "[UPDATE] Short: %i, %i, %i", TaskID, Activity, fixed_index); - SendTaskActivityShort(c, TaskID, Activity, fixed_index); + SendTaskActivityShort(client, TaskID, Activity, fixed_index); } Sequence++; } @@ -3238,18 +3205,18 @@ void TaskManager::SendActiveTasksToClient(Client *c, bool TaskComplete) } void TaskManager::SendSingleActiveTaskToClient( - Client *c, ClientTaskInformation &task_info, bool TaskComplete, - bool BringUpTaskJournal + Client *client, ClientTaskInformation &task_info, bool task_complete, + bool bring_up_task_journal ) { int TaskID = task_info.task_id; - if (TaskID == 0 || Tasks[TaskID] == nullptr) { + if (TaskID == 0 || p_task_data[TaskID] == nullptr) { return; } int StartTime = task_info.accepted_time; - SendActiveTaskDescription(c, TaskID, task_info, StartTime, Tasks[TaskID]->duration, BringUpTaskJournal); + SendActiveTaskDescription(client, TaskID, task_info, StartTime, p_task_data[TaskID]->duration, bring_up_task_journal); Log(Logs::General, Logs::Tasks, "[UPDATE] SendSingleActiveTasksToClient: Task %i, Activities: %i", @@ -3258,55 +3225,55 @@ void TaskManager::SendSingleActiveTaskToClient( for (int Activity = 0; Activity < GetActivityCount(TaskID); Activity++) { if (task_info.activity[Activity].activity_state != ActivityHidden) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i Complete=%i", TaskID, Activity, TaskComplete); + Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i Complete=%i", TaskID, Activity, task_complete); if (Activity == GetActivityCount(TaskID) - 1) { SendTaskActivityLong( - c, TaskID, Activity, task_info.slot, - Tasks[TaskID]->activity_information[Activity].Optional, TaskComplete + client, TaskID, Activity, task_info.slot, + p_task_data[TaskID]->activity_information[Activity].Optional, task_complete ); } else { SendTaskActivityLong( - c, TaskID, Activity, task_info.slot, - Tasks[TaskID]->activity_information[Activity].Optional, 0 + client, TaskID, Activity, task_info.slot, + p_task_data[TaskID]->activity_information[Activity].Optional, 0 ); } } else { Log(Logs::General, Logs::Tasks, "[UPDATE] Short: %i, %i", TaskID, Activity); - SendTaskActivityShort(c, TaskID, Activity, task_info.slot); + SendTaskActivityShort(client, TaskID, Activity, task_info.slot); } } } void TaskManager::SendActiveTaskDescription( - Client *c, - int TaskID, + Client *client, + int task_id, ClientTaskInformation &task_info, - int StartTime, - int Duration, - bool BringUpTaskJournal + int start_time, + int duration, + bool bring_up_task_journal ) { - if ((TaskID < 1) || (TaskID >= MAXTASKS) || !Tasks[TaskID]) { + if ((task_id < 1) || (task_id >= MAXTASKS) || !p_task_data[task_id]) { return; } - int PacketLength = sizeof(TaskDescriptionHeader_Struct) + Tasks[TaskID]->title.length() + 1 - + sizeof(TaskDescriptionData1_Struct) + Tasks[TaskID]->description.length() + 1 + int PacketLength = sizeof(TaskDescriptionHeader_Struct) + p_task_data[task_id]->title.length() + 1 + + sizeof(TaskDescriptionData1_Struct) + p_task_data[task_id]->description.length() + 1 + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); // If there is an item make the reward text into a link to the item (only the first item if a list // is specified). I have been unable to get multiple item links to work. // - if (Tasks[TaskID]->reward_id && Tasks[TaskID]->item_link.empty()) { + if (p_task_data[task_id]->reward_id && p_task_data[task_id]->item_link.empty()) { int ItemID = 0; // If the reward is a list of items, and the first entry on the list is valid - if (Tasks[TaskID]->reward_method == METHODSINGLEID) { - ItemID = Tasks[TaskID]->reward_id; + if (p_task_data[task_id]->reward_method == METHODSINGLEID) { + ItemID = p_task_data[task_id]->reward_id; } - else if (Tasks[TaskID]->reward_method == METHODLIST) { - ItemID = GoalListManager.GetFirstEntry(Tasks[TaskID]->reward_id); + else if (p_task_data[task_id]->reward_method == METHODLIST) { + ItemID = goal_list_manager.GetFirstEntry(p_task_data[task_id]->reward_id); if (ItemID < 0) { ItemID = 0; } @@ -3319,11 +3286,11 @@ void TaskManager::SendActiveTaskDescription( linker.SetLinkType(EQ::saylink::SayLinkItemData); linker.SetItemData(reward_item); linker.SetTaskUse(); - Tasks[TaskID]->item_link = linker.GenerateLink(); + p_task_data[task_id]->item_link = linker.GenerateLink(); } } - PacketLength += Tasks[TaskID]->reward.length() + 1 + Tasks[TaskID]->item_link.length() + 1; + PacketLength += p_task_data[task_id]->reward.length() + 1 + p_task_data[task_id]->item_link.length() + 1; char *Ptr; TaskDescriptionHeader_Struct *tdh; @@ -3336,27 +3303,27 @@ void TaskManager::SendActiveTaskDescription( tdh = (TaskDescriptionHeader_Struct *) outapp->pBuffer; tdh->SequenceNumber = task_info.slot; - tdh->TaskID = TaskID; - tdh->open_window = BringUpTaskJournal; - tdh->task_type = static_cast(Tasks[TaskID]->type); + tdh->TaskID = task_id; + tdh->open_window = bring_up_task_journal; + tdh->task_type = static_cast(p_task_data[task_id]->type); tdh->reward_type = 0; // TODO: 4 says Radiant Crystals else Ebon Crystals when shared task Ptr = (char *) tdh + sizeof(TaskDescriptionHeader_Struct); - sprintf(Ptr, "%s", Tasks[TaskID]->title.c_str()); - Ptr += Tasks[TaskID]->title.length() + 1; + sprintf(Ptr, "%s", p_task_data[task_id]->title.c_str()); + Ptr += p_task_data[task_id]->title.length() + 1; tdd1 = (TaskDescriptionData1_Struct *) Ptr; - tdd1->Duration = Duration; - tdd1->dur_code = static_cast(Tasks[TaskID]->duration_code); + tdd1->Duration = duration; + tdd1->dur_code = static_cast(p_task_data[task_id]->duration_code); - tdd1->StartTime = StartTime; + tdd1->StartTime = start_time; Ptr = (char *) tdd1 + sizeof(TaskDescriptionData1_Struct); - sprintf(Ptr, "%s", Tasks[TaskID]->description.c_str()); - Ptr += Tasks[TaskID]->description.length() + 1; + sprintf(Ptr, "%s", p_task_data[task_id]->description.c_str()); + Ptr += p_task_data[task_id]->description.length() + 1; tdd2 = (TaskDescriptionData2_Struct *) Ptr; @@ -3365,26 +3332,26 @@ void TaskManager::SendActiveTaskDescription( // "has_reward_selection" is after this bool! Smaller packet when this is 0 tdd2->has_rewards = 1; - tdd2->coin_reward = Tasks[TaskID]->cash_reward; - tdd2->xp_reward = Tasks[TaskID]->experience_reward ? 1 : 0; // just booled - tdd2->faction_reward = Tasks[TaskID]->faction_reward ? 1 : 0; // faction booled + tdd2->coin_reward = p_task_data[task_id]->cash_reward; + tdd2->xp_reward = p_task_data[task_id]->experience_reward ? 1 : 0; // just booled + tdd2->faction_reward = p_task_data[task_id]->faction_reward ? 1 : 0; // faction booled Ptr = (char *) tdd2 + sizeof(TaskDescriptionData2_Struct); // we actually have 2 strings here. One is max length 96 and not parsed for item links // We actually skipped past that string incorrectly before, so TODO: fix item link string - sprintf(Ptr, "%s", Tasks[TaskID]->reward.c_str()); - Ptr += Tasks[TaskID]->reward.length() + 1; + sprintf(Ptr, "%s", p_task_data[task_id]->reward.c_str()); + Ptr += p_task_data[task_id]->reward.length() + 1; // second string is parsed for item links - sprintf(Ptr, "%s", Tasks[TaskID]->item_link.c_str()); - Ptr += Tasks[TaskID]->item_link.length() + 1; + sprintf(Ptr, "%s", p_task_data[task_id]->item_link.c_str()); + Ptr += p_task_data[task_id]->item_link.length() + 1; tdt = (TaskDescriptionTrailer_Struct *) Ptr; tdt->Points = 0x00000000; // Points Count TODO: this does have a visible affect on the client ... tdt->has_reward_selection = 0; // TODO: new rewards window - c->QueuePacket(outapp); + client->QueuePacket(outapp); safe_delete(outapp); } @@ -3659,7 +3626,7 @@ void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enfor return; } - auto task = p_task_manager->Tasks[TaskID]; + auto task = p_task_manager->p_task_data[TaskID]; if (task == nullptr) { c->Message(Chat::Red, "Invalid task_id %i", TaskID); @@ -3750,7 +3717,7 @@ void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enfor active_slot->updated = true; active_slot->current_step = -1; - for (int i = 0; i < p_task_manager->Tasks[TaskID]->activity_count; i++) { + for (int i = 0; i < p_task_manager->p_task_data[TaskID]->activity_count; i++) { active_slot->activity[i].activity_id = i; active_slot->activity[i].done_count = 0; active_slot->activity[i].activity_state = ActivityHidden; @@ -3764,7 +3731,7 @@ void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enfor } p_task_manager->SendSingleActiveTaskToClient(c, *active_slot, false, true); - c->Message(Chat::White, "You have been assigned the task '%s'.", p_task_manager->Tasks[TaskID]->title.c_str()); + c->Message(Chat::White, "You have been assigned the task '%s'.", p_task_manager->p_task_data[TaskID]->title.c_str()); p_task_manager->SaveClientState(c, this); std::string buf = std::to_string(TaskID); @@ -3784,7 +3751,7 @@ void ClientTaskState::ProcessTaskProximities(Client *c, float X, float Y, float if ((LastX == X) && (LastY == Y) && (LastZ == Z)) { return; } Log(Logs::General, Logs::Tasks, "[PROXIMITY] Checking proximities for Position %8.3f, %8.3f, %8.3f", X, Y, Z); - int ExploreID = p_task_manager->ProximityManager.CheckProximities(X, Y, Z); + int ExploreID = p_task_manager->proximity_manager.CheckProximities(X, Y, Z); if (ExploreID > 0) { Log(Logs::General, diff --git a/zone/tasks.h b/zone/tasks.h index bea2dadc0..af95cda63 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -269,17 +269,17 @@ public: private: bool UnlockActivities(int character_id, ClientTaskInformation &task_info); void IncrementDoneCount( - Client *c, - TaskInformation *Task, - int TaskIndex, - int ActivityID, - int Count = 1, + Client *client, + TaskInformation *task_information, + int task_index, + int activity_id, + int count = 1, bool ignore_quest_update = false ); - inline ClientTaskInformation *GetClientTaskInfo(TaskType type, int index) + inline ClientTaskInformation *GetClientTaskInfo(TaskType task_type, int index) { ClientTaskInformation *info = nullptr; - switch (type) { + switch (task_type) { case TaskType::Task: if (index == 0) { info = &active_task; @@ -298,6 +298,7 @@ private: return info; } int active_task_count; + union { // easier to loop over struct { ClientTaskInformation active_task; // only one @@ -318,67 +319,76 @@ class TaskManager { public: TaskManager(); ~TaskManager(); - int GetActivityCount(int TaskID); - bool LoadSingleTask(int TaskID); - bool LoadTasks(int SingleTask = 0); + int GetActivityCount(int task_id); + bool LoadTasks(int single_task = 0); void ReloadGoalLists(); - inline void LoadProximities(int ZoneID) { ProximityManager.LoadProximities(ZoneID); } + inline void LoadProximities(int zone_id) + { + proximity_manager.LoadProximities(zone_id); + } bool LoadTaskSets(); - bool LoadClientState(Client *c, ClientTaskState *state); - bool SaveClientState(Client *c, ClientTaskState *state); - void SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *TaskList); - void SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *TaskList); - bool ValidateLevel(int TaskID, int PlayerLevel); - int GetTaskMinLevel(int TaskID); - int GetTaskMaxLevel(int TaskID); + bool LoadClientState(Client *client, ClientTaskState *client_task_state); + bool SaveClientState(Client *client, ClientTaskState *client_task_state); + void SendTaskSelector(Client *client, Mob *mob, int task_count, int *task_list); + void SendTaskSelectorNew(Client *client, Mob *mob, int task_count, int *task_list); + bool ValidateLevel(int task_id, int player_level); std::string GetTaskName(uint32 task_id); TaskType GetTaskType(uint32 task_id); - void TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, int TaskSetID); + void TaskSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int task_set_id); + // task list provided by QuestManager (perl/lua) void TaskQuestSetSelector( - Client *c, - ClientTaskState *state, + Client *client, + ClientTaskState *client_task_state, Mob *mob, int count, int *tasks - ); // task list provided by QuestManager (perl/lua) - void SendActiveTasksToClient(Client *c, bool TaskComplete = false); - void SendSingleActiveTaskToClient( - Client *c, - ClientTaskInformation &task_info, - bool TaskComplete, - bool BringUpTaskJournal = false ); - void SendTaskActivityShort(Client *c, int TaskID, int ActivityID, int ClientTaskIndex); + void SendActiveTasksToClient(Client *client, bool task_complete = false); + void SendSingleActiveTaskToClient( + Client *client, + ClientTaskInformation &task_info, + bool task_complete, + bool bring_up_task_journal = false + ); + void SendTaskActivityShort(Client *client, int task_id, int activity_id, int client_task_index); void SendTaskActivityLong( - Client *c, int TaskID, int ActivityID, int ClientTaskIndex, - bool Optional, bool TaskComplete = false + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete = false ); void SendTaskActivityNew( - Client *c, int TaskID, int ActivityID, int ClientTaskIndex, - bool Optional, bool TaskComplete = false + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete = false ); - void SendCompletedTasksToClient(Client *c, ClientTaskState *state); - void ExplainTask(Client *c, int TaskID); - int FirstTaskInSet(int TaskSet); - int LastTaskInSet(int TaskSet); - int NextTaskInSet(int TaskSet, int TaskID); - bool IsTaskRepeatable(int TaskID); + void SendCompletedTasksToClient(Client *c, ClientTaskState *client_task_state); + void ExplainTask(Client *client, int task_id); + int FirstTaskInSet(int task_set); + int LastTaskInSet(int task_set); + int NextTaskInSet(int task_set, int task_id); + bool IsTaskRepeatable(int task_id); friend class ClientTaskState; private: - TaskGoalListManager GoalListManager; - TaskProximityManager ProximityManager; - TaskInformation *Tasks[MAXTASKS]; - std::vector TaskSets[MAXTASKSETS]; + TaskGoalListManager goal_list_manager; + TaskProximityManager proximity_manager; + TaskInformation *p_task_data[MAXTASKS]; + std::vector task_sets[MAXTASKSETS]; void SendActiveTaskDescription( - Client *c, - int TaskID, + Client *client, + int task_id, ClientTaskInformation &task_info, - int StartTime, - int Duration, - bool BringUpTaskJournal = false + int start_time, + int duration, + bool bring_up_task_journal = false ); }; From aeb0dbc6ae73d665a53a32dae26848721685f6e9 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 01:14:32 -0600 Subject: [PATCH 03/26] Third pass --- zone/tasks.cpp | 446 ++++++++++++++++++++++++------------------------- zone/tasks.h | 70 ++++---- 2 files changed, 258 insertions(+), 258 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index f7edb5424..b188b61a7 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -775,7 +775,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s return true; } -void ClientTaskState::EnableTask(int character_id, int task_count, int *tasks) +void ClientTaskState::EnableTask(int character_id, int task_count, int *task_list) { // Check if the Task is already enabled for this client std::vector tasks_enabled; @@ -786,22 +786,22 @@ void ClientTaskState::EnableTask(int character_id, int task_count, int *tasks) while (iterator != enabled_tasks.end()) { // If this task is already enabled, stop looking - if ((*iterator) == tasks[i]) { + if ((*iterator) == task_list[i]) { addTask = false; break; } // Our list of enabled tasks is sorted, so we can quit if we find a taskid higher than // the one we are looking for. - if ((*iterator) > tasks[i]) { + if ((*iterator) > task_list[i]) { break; } ++iterator; } if (addTask) { - enabled_tasks.insert(iterator, tasks[i]); + enabled_tasks.insert(iterator, task_list[i]); // Make a note of the task we enabled, for later SQL generation - tasks_enabled.push_back(tasks[i]); + tasks_enabled.push_back(task_list[i]); } } @@ -890,7 +890,7 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li } } -bool ClientTaskState::IsTaskEnabled(int TaskID) +bool ClientTaskState::IsTaskEnabled(int task_id) { std::vector::iterator Iterator; @@ -898,15 +898,15 @@ bool ClientTaskState::IsTaskEnabled(int TaskID) Iterator = enabled_tasks.begin(); while (Iterator != enabled_tasks.end()) { - if ((*Iterator) == TaskID) { return true; } - if ((*Iterator) > TaskID) { break; } + if ((*Iterator) == task_id) { return true; } + if ((*Iterator) > task_id) { break; } ++Iterator; } return false; } -int ClientTaskState::EnabledTaskCount(int TaskSetID) +int ClientTaskState::EnabledTaskCount(int task_set_id) { // Return the number of tasks in TaskSet that this character is enabled for. @@ -915,11 +915,11 @@ int ClientTaskState::EnabledTaskCount(int TaskSetID) unsigned int TaskSetIndex = 0; int EnabledTaskCount = 0; - if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { return -1; } + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } - while ((EnabledTaskIndex < enabled_tasks.size()) && (TaskSetIndex < p_task_manager->task_sets[TaskSetID].size())) { + while ((EnabledTaskIndex < enabled_tasks.size()) && (TaskSetIndex < p_task_manager->task_sets[task_set_id].size())) { - if (enabled_tasks[EnabledTaskIndex] == p_task_manager->task_sets[TaskSetID][TaskSetIndex]) { + if (enabled_tasks[EnabledTaskIndex] == p_task_manager->task_sets[task_set_id][TaskSetIndex]) { EnabledTaskCount++; EnabledTaskIndex++; @@ -927,7 +927,7 @@ int ClientTaskState::EnabledTaskCount(int TaskSetID) continue; } - if (enabled_tasks[EnabledTaskIndex] < p_task_manager->task_sets[TaskSetID][TaskSetIndex]) { + if (enabled_tasks[EnabledTaskIndex] < p_task_manager->task_sets[task_set_id][TaskSetIndex]) { EnabledTaskIndex++; } else { @@ -938,32 +938,32 @@ int ClientTaskState::EnabledTaskCount(int TaskSetID) return EnabledTaskCount; } -int ClientTaskState::ActiveTasksInSet(int TaskSetID) +int ClientTaskState::ActiveTasksInSet(int task_set_id) { - if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { return -1; } + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } int Count = 0; - for (unsigned int i = 0; i < p_task_manager->task_sets[TaskSetID].size(); i++) - if (IsTaskActive(p_task_manager->task_sets[TaskSetID][i])) { + for (unsigned int i = 0; i < p_task_manager->task_sets[task_set_id].size(); i++) + if (IsTaskActive(p_task_manager->task_sets[task_set_id][i])) { Count++; } return Count; } -int ClientTaskState::CompletedTasksInSet(int TaskSetID) +int ClientTaskState::CompletedTasksInSet(int task_set_id) { - if ((TaskSetID <= 0) || (TaskSetID >= MAXTASKSETS)) { return -1; } + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } int Count = 0; - for (unsigned int i = 0; i < p_task_manager->task_sets[TaskSetID].size(); i++) - if (IsTaskCompleted(p_task_manager->task_sets[TaskSetID][i])) { + for (unsigned int i = 0; i < p_task_manager->task_sets[task_set_id].size(); i++) + if (IsTaskCompleted(p_task_manager->task_sets[task_set_id][i])) { Count++; } @@ -1632,17 +1632,17 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & return false; } -void ClientTaskState::UpdateTasksOnKill(Client *c, int NPCTypeID) +void ClientTaskState::UpdateTasksOnKill(Client *client, int npc_type_id) { - UpdateTasksByNPC(c, ActivityKill, NPCTypeID); + UpdateTasksByNPC(client, ActivityKill, npc_type_id); } -bool ClientTaskState::UpdateTasksOnSpeakWith(Client *c, int NPCTypeID) +bool ClientTaskState::UpdateTasksOnSpeakWith(Client *client, int npc_type_id) { - return UpdateTasksByNPC(c, ActivitySpeakWith, NPCTypeID); + return UpdateTasksByNPC(client, ActivitySpeakWith, npc_type_id); } -bool ClientTaskState::UpdateTasksByNPC(Client *c, int activity_type, int npc_type_id) +bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int npc_type_id) { int is_updating = false; @@ -1678,7 +1678,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *c, int activity_type, int npc_typ if (!p_task_information->activity_information[activity_id].CheckZone(zone->GetZoneID())) { LogTasks( "[UPDATE] character [{}] task_id [{}] activity_id [{}] activity_type [{}] for NPC [{}] failed zone check", - c->GetName(), + client->GetName(), current_task->task_id, activity_id, activity_type, @@ -1706,7 +1706,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *c, int activity_type, int npc_typ } // We found an active p_task_information to kill this type of NPC, so increment the done count LogTasksDetail("Calling increment done count ByNPC"); - IncrementDoneCount(c, p_task_information, current_task->slot, activity_id); + IncrementDoneCount(client, p_task_information, current_task->slot, activity_id); is_updating = true; } } @@ -1803,7 +1803,7 @@ int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) return 0; } -void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemID, int Count) +void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_type, int item_id, int count) { // This method updates the client's task activities of the specified type which relate @@ -1813,7 +1813,7 @@ void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemI // If the client has no tasks, there is nothing further to check. - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksForItem(%d,%d)", Type, ItemID); + Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksForItem(%d,%d)", activity_type, item_id); if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; @@ -1840,13 +1840,13 @@ void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemI continue; } // We are only interested in the ActivityType we were called with - if (Task->activity_information[j].Type != (int) Type) { + if (Task->activity_information[j].Type != (int) activity_type) { continue; } // Is there a zone restriction on the activity_information ? if (!Task->activity_information[j].CheckZone(zone->GetZoneID())) { Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s activity_information type %i for Item %i failed zone check", - c->GetName(), Type, ItemID); + client->GetName(), activity_type, item_id); continue; } // Is the activity_information related to this item ? @@ -1854,11 +1854,11 @@ void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemI switch (Task->activity_information[j].GoalMethod) { case METHODSINGLEID: - if (Task->activity_information[j].GoalID != ItemID) { continue; } + if (Task->activity_information[j].GoalID != item_id) { continue; } break; case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList(Task->activity_information[j].GoalID, ItemID)) { continue; } + if (!p_task_manager->goal_list_manager.IsInList(Task->activity_information[j].GoalID, item_id)) { continue; } break; default: @@ -1867,19 +1867,19 @@ void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemI } // We found an active task related to this item, so increment the done count Log(Logs::General, Logs::Tasks, "[UPDATE] Calling increment done count ForItem"); - IncrementDoneCount(c, Task, cur_task->slot, j, Count); + IncrementDoneCount(client, Task, cur_task->slot, j, count); } } return; } -void ClientTaskState::UpdateTasksOnExplore(Client *c, int ExploreID) +void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) { // If the client has no tasks, there is nothing further to check. - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksOnExplore(%i)", ExploreID); + Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksOnExplore(%i)", explore_id); if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; } @@ -1910,21 +1910,21 @@ void ClientTaskState::UpdateTasksOnExplore(Client *c, int ExploreID) } if (!Task->activity_information[j].CheckZone(zone->GetZoneID())) { Log(Logs::General, Logs::Tasks, - "[UPDATE] Char: %s Explore exploreid %i failed zone check", c->GetName(), - ExploreID); + "[UPDATE] Char: %s Explore exploreid %i failed zone check", client->GetName(), + explore_id); continue; } // Is the activity_information to explore this area id ? switch (Task->activity_information[j].GoalMethod) { case METHODSINGLEID: - if (Task->activity_information[j].GoalID != ExploreID) { + if (Task->activity_information[j].GoalID != explore_id) { continue; } break; case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList(Task->activity_information[j].GoalID, ExploreID)) { + if (!p_task_manager->goal_list_manager.IsInList(Task->activity_information[j].GoalID, explore_id)) { continue; } break; @@ -1937,7 +1937,7 @@ void ClientTaskState::UpdateTasksOnExplore(Client *c, int ExploreID) // (Only a goal count of 1 makes sense for explore activities?) Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on explore"); IncrementDoneCount( - c, Task, cur_task->slot, j, + client, Task, cur_task->slot, j, Task->activity_information[j].GoalCount - cur_task->activity[j].done_count ); } @@ -1946,11 +1946,11 @@ void ClientTaskState::UpdateTasksOnExplore(Client *c, int ExploreID) return; } -bool ClientTaskState::UpdateTasksOnDeliver(Client *c, std::list &Items, int Cash, int NPCTypeID) +bool ClientTaskState::UpdateTasksOnDeliver(Client *client, std::list &items, int cash, int npc_type_id) { bool Ret = false; - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksForOnDeliver(%d)", NPCTypeID); + Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksForOnDeliver(%d)", npc_type_id); if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return false; @@ -1985,22 +1985,22 @@ bool ClientTaskState::UpdateTasksOnDeliver(Client *c, std::listGetName(), zone->GetZoneID(), Task->activity_information[j].zones.c_str()); + client->GetName(), zone->GetZoneID(), Task->activity_information[j].zones.c_str()); continue; } // Is the activity_information to deliver to this NPCTypeID ? - if (Task->activity_information[j].DeliverToNPC != NPCTypeID) { + if (Task->activity_information[j].DeliverToNPC != npc_type_id) { continue; } // Is the activity_information related to these items ? // - if ((Task->activity_information[j].Type == ActivityGiveCash) && Cash) { + if ((Task->activity_information[j].Type == ActivityGiveCash) && cash) { Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on GiveCash"); - IncrementDoneCount(c, Task, i, j, Cash); + IncrementDoneCount(client, Task, i, j, cash); Ret = true; } else { - for (auto &k : Items) { + for (auto &k : items) { switch (Task->activity_information[j].GoalMethod) { case METHODSINGLEID: @@ -2023,7 +2023,7 @@ bool ClientTaskState::UpdateTasksOnDeliver(Client *c, std::listslot, j, k->GetCharges() <= 0 ? 1 : k->GetCharges()); + IncrementDoneCount(client, Task, cur_task->slot, j, k->GetCharges() <= 0 ? 1 : k->GetCharges()); Ret = true; } } @@ -2033,11 +2033,11 @@ bool ClientTaskState::UpdateTasksOnDeliver(Client *c, std::listactivity_information[j].GoalMethod != METHODSINGLEID) { continue; } - if (!Task->activity_information[j].CheckZone(ZoneID)) { + if (!Task->activity_information[j].CheckZone(zone_id)) { Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Touch activity_information failed zone check", - c->GetName()); + client->GetName()); continue; } // We found an active task to zone into this zone, so set done count to goal count // (Only a goal count of 1 makes sense for touch activities?) Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on Touch"); IncrementDoneCount( - c, Task, cur_task->slot, j, + client, Task, cur_task->slot, j, Task->activity_information[j].GoalCount - cur_task->activity[j].done_count ); } @@ -2211,33 +2211,33 @@ void ClientTaskState::IncrementDoneCount( } } -void ClientTaskState::RewardTask(Client *c, TaskInformation *Task) +void ClientTaskState::RewardTask(Client *client, TaskInformation *task_information) { - if (!Task || !c) { return; } + if (!task_information || !client) { return; } const EQ::ItemData *Item; std::vector RewardList; - switch (Task->reward_method) { + switch (task_information->reward_method) { case METHODSINGLEID: { - if (Task->reward_id) { - c->SummonItem(Task->reward_id); - Item = database.GetItem(Task->reward_id); + if (task_information->reward_id) { + client->SummonItem(task_information->reward_id); + Item = database.GetItem(task_information->reward_id); if (Item) { - c->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); + client->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); } } break; } case METHODLIST: { - RewardList = p_task_manager->goal_list_manager.GetListContents(Task->reward_id); + RewardList = p_task_manager->goal_list_manager.GetListContents(task_information->reward_id); for (unsigned int i = 0; i < RewardList.size(); i++) { - c->SummonItem(RewardList[i]); + client->SummonItem(RewardList[i]); Item = database.GetItem(RewardList[i]); if (Item) { - c->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); + client->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); } } break; @@ -2248,22 +2248,22 @@ void ClientTaskState::RewardTask(Client *c, TaskInformation *Task) } } - if (!Task->completion_emote.empty()) { - c->SendColoredText( + if (!task_information->completion_emote.empty()) { + client->SendColoredText( Chat::Yellow, - Task->completion_emote + task_information->completion_emote ); } // unsure if they use this packet or color, should work // just use normal NPC faction ID stuff - if (Task->faction_reward) - c->SetFactionLevel(c->CharacterID(), Task->faction_reward, c->GetBaseClass(), c->GetBaseRace(), c->GetDeity()); + if (task_information->faction_reward) + client->SetFactionLevel(client->CharacterID(), task_information->faction_reward, client->GetBaseClass(), client->GetBaseRace(), client->GetDeity()); - if (Task->cash_reward) { + if (task_information->cash_reward) { int Plat, Gold, Silver, Copper; - Copper = Task->cash_reward; - c->AddMoneyToPP(Copper, true); + Copper = task_information->cash_reward; + client->AddMoneyToPP(Copper, true); Plat = Copper / 1000; Copper = Copper - (Plat * 1000); @@ -2310,11 +2310,11 @@ void ClientTaskState::RewardTask(Client *c, TaskInformation *Task) CashMessage += " copper"; } CashMessage += " pieces."; - c->Message(Chat::Yellow, CashMessage.c_str()); + client->Message(Chat::Yellow, CashMessage.c_str()); } - int32 EXPReward = Task->experience_reward; + int32 EXPReward = task_information->experience_reward; if (EXPReward > 0) { - c->AddEXP(EXPReward); + client->AddEXP(EXPReward); } if (EXPReward < 0) { uint32 PosReward = EXPReward * -1; @@ -2322,25 +2322,25 @@ void ClientTaskState::RewardTask(Client *c, TaskInformation *Task) if (PosReward > 100 && PosReward < 25700) { uint8 MaxLevel = PosReward / 100; uint8 ExpPercent = PosReward - (MaxLevel * 100); - c->AddLevelBasedExp(ExpPercent, MaxLevel); + client->AddLevelBasedExp(ExpPercent, MaxLevel); } } - c->SendSound(); + client->SendSound(); } -bool ClientTaskState::IsTaskActive(int TaskID) +bool ClientTaskState::IsTaskActive(int task_id) { - if (active_task.task_id == TaskID) { + if (active_task.task_id == task_id) { return true; } - if (active_task_count == 0 || TaskID == 0) { + if (active_task_count == 0 || task_id == 0) { return false; } for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == TaskID) { + if (active_quests[i].task_id == task_id) { return true; } } @@ -2348,14 +2348,14 @@ bool ClientTaskState::IsTaskActive(int TaskID) return false; } -void ClientTaskState::FailTask(Client *c, int TaskID) +void ClientTaskState::FailTask(Client *client, int task_id) { - Log(Logs::General, Logs::Tasks, "[UPDATE] FailTask %i, ActiveTaskCount is %i", TaskID, active_task_count); + Log(Logs::General, Logs::Tasks, "[UPDATE] FailTask %i, ActiveTaskCount is %i", task_id, active_task_count); - if (active_task.task_id == TaskID) { - c->SendTaskFailed(TaskID, 0, TaskType::Task); + if (active_task.task_id == task_id) { + client->SendTaskFailed(task_id, 0, TaskType::Task); // Remove the task from the client - c->CancelTask(0, TaskType::Task); + client->CancelTask(0, TaskType::Task); return; } @@ -2366,22 +2366,22 @@ void ClientTaskState::FailTask(Client *c, int TaskID) } for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == TaskID) { - c->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); + if (active_quests[i].task_id == task_id) { + client->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); // Remove the task from the client - c->CancelTask(i, TaskType::Quest); + client->CancelTask(i, TaskType::Quest); return; } } } // TODO: Shared tasks -bool ClientTaskState::IsTaskActivityActive(int TaskID, int ActivityID) +bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) { - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i).", TaskID, ActivityID); + Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i).", task_id, activity_id); // Quick sanity check - if (ActivityID < 0) { + if (activity_id < 0) { return false; } if (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY) { @@ -2391,13 +2391,13 @@ bool ClientTaskState::IsTaskActivityActive(int TaskID, int ActivityID) int ActiveTaskIndex = -1; auto type = TaskType::Task; - if (active_task.task_id == TaskID) { + if (active_task.task_id == task_id) { ActiveTaskIndex = 0; } if (ActiveTaskIndex == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == TaskID) { + if (active_quests[i].task_id == task_id) { ActiveTaskIndex = i; type = TaskType::Quest; break; @@ -2424,42 +2424,42 @@ bool ClientTaskState::IsTaskActivityActive(int TaskID, int ActivityID) } // The activity_id is out of range - if (ActivityID >= Task->activity_count) { + if (activity_id >= Task->activity_count) { return false; } - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i). activity_state is %i ", TaskID, - ActivityID, info->activity[ActivityID].activity_state); + Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i). activity_state is %i ", task_id, + activity_id, info->activity[activity_id].activity_state); - return (info->activity[ActivityID].activity_state == ActivityActive); + return (info->activity[activity_id].activity_state == ActivityActive); } void ClientTaskState::UpdateTaskActivity( - Client *c, - int TaskID, - int ActivityID, - int Count, + Client *client, + int task_id, + int activity_id, + int count, bool ignore_quest_update /*= false*/) { - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState UpdateTaskActivity(%i, %i, %i).", TaskID, ActivityID, - Count); + Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState UpdateTaskActivity(%i, %i, %i).", task_id, activity_id, + count); // Quick sanity check - if (ActivityID < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { + if (activity_id < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { return; } int ActiveTaskIndex = -1; auto type = TaskType::Task; - if (active_task.task_id == TaskID) { + if (active_task.task_id == task_id) { ActiveTaskIndex = 0; } if (ActiveTaskIndex == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == TaskID) { + if (active_quests[i].task_id == task_id) { ActiveTaskIndex = i; type = TaskType::Quest; break; @@ -2486,38 +2486,38 @@ void ClientTaskState::UpdateTaskActivity( } // The activity_id is out of range - if (ActivityID >= Task->activity_count) { + if (activity_id >= Task->activity_count) { return; } // The activity_information is not currently active - if (info->activity[ActivityID].activity_state == ActivityHidden) { + if (info->activity[activity_id].activity_state == ActivityHidden) { return; } - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment done count on UpdateTaskActivity %d %d", ActivityID, Count); - IncrementDoneCount(c, Task, ActiveTaskIndex, ActivityID, Count, ignore_quest_update); + Log(Logs::General, Logs::Tasks, "[UPDATE] Increment done count on UpdateTaskActivity %d %d", activity_id, count); + IncrementDoneCount(client, Task, ActiveTaskIndex, activity_id, count, ignore_quest_update); } -void ClientTaskState::ResetTaskActivity(Client *c, int TaskID, int ActivityID) +void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activity_id) { - Log(Logs::General, Logs::Tasks, "[RESET] ClientTaskState ResetTaskActivity(%i, %i).", TaskID, ActivityID); + Log(Logs::General, Logs::Tasks, "[RESET] ClientTaskState ResetTaskActivity(%i, %i).", task_id, activity_id); // Quick sanity check - if (ActivityID < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { + if (activity_id < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { return; } int ActiveTaskIndex = -1; auto type = TaskType::Task; - if (active_task.task_id == TaskID) { + if (active_task.task_id == task_id) { ActiveTaskIndex = 0; } if (ActiveTaskIndex == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == TaskID) { + if (active_quests[i].task_id == task_id) { ActiveTaskIndex = i; type = TaskType::Quest; break; @@ -2544,27 +2544,27 @@ void ClientTaskState::ResetTaskActivity(Client *c, int TaskID, int ActivityID) } // The activity_id is out of range - if (ActivityID >= Task->activity_count) { + if (activity_id >= Task->activity_count) { return; } // The activity_information is not currently active - if (info->activity[ActivityID].activity_state == ActivityHidden) { + if (info->activity[activity_id].activity_state == ActivityHidden) { return; } Log(Logs::General, Logs::Tasks, "[RESET] Increment done count on ResetTaskActivity"); - IncrementDoneCount(c, Task, ActiveTaskIndex, ActivityID, (info->activity[ActivityID].done_count * -1), false); + IncrementDoneCount(client, Task, ActiveTaskIndex, activity_id, (info->activity[activity_id].done_count * -1), false); } -void ClientTaskState::ShowClientTasks(Client *c) +void ClientTaskState::ShowClientTasks(Client *client) { - c->Message(Chat::White, "Task Information:"); + client->Message(Chat::White, "Task Information:"); if (active_task.task_id != TASKSLOTEMPTY) { - c->Message(Chat::White, "Task: %i %s", active_task.task_id, p_task_manager->p_task_data[active_task.task_id]->title.c_str()); - c->Message(Chat::White, " description: [%s]\n", p_task_manager->p_task_data[active_task.task_id]->description.c_str()); + client->Message(Chat::White, "Task: %i %s", active_task.task_id, p_task_manager->p_task_data[active_task.task_id]->title.c_str()); + client->Message(Chat::White, " description: [%s]\n", p_task_manager->p_task_data[active_task.task_id]->description.c_str()); for (int j = 0; j < p_task_manager->GetActivityCount(active_task.task_id); j++) { - c->Message( + client->Message( Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", active_task.activity[j].activity_id, active_task.activity[j].done_count, active_task.activity[j].activity_state @@ -2577,15 +2577,15 @@ void ClientTaskState::ShowClientTasks(Client *c) continue; } - c->Message( + client->Message( Chat::White, "Quest: %i %s", active_quests[i].task_id, p_task_manager->p_task_data[active_quests[i].task_id]->title.c_str()); - c->Message( + client->Message( Chat::White, " description: [%s]\n", p_task_manager->p_task_data[active_quests[i].task_id]->description.c_str()); for (int j = 0; j < p_task_manager->GetActivityCount(active_quests[i].task_id); j++) { - c->Message( + client->Message( Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", active_quests[i].activity[j].activity_id, active_quests[i].activity[j].done_count, active_quests[i].activity[j].activity_state @@ -2595,12 +2595,12 @@ void ClientTaskState::ShowClientTasks(Client *c) } // TODO: Shared Task -int ClientTaskState::TaskTimeLeft(int TaskID) +int ClientTaskState::TaskTimeLeft(int task_id) { - if (active_task.task_id == TaskID) { + if (active_task.task_id == task_id) { int Now = time(nullptr); - TaskInformation *Task = p_task_manager->p_task_data[TaskID]; + TaskInformation *Task = p_task_manager->p_task_data[task_id]; if (Task == nullptr) { return -1; @@ -2621,7 +2621,7 @@ int ClientTaskState::TaskTimeLeft(int TaskID) for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id != TaskID) { + if (active_quests[i].task_id != task_id) { continue; } @@ -2647,7 +2647,7 @@ int ClientTaskState::TaskTimeLeft(int TaskID) return -1; } -int ClientTaskState::IsTaskCompleted(int TaskID) +int ClientTaskState::IsTaskCompleted(int task_id) { // Returns: -1 if RecordCompletedTasks is not true @@ -2661,8 +2661,8 @@ int ClientTaskState::IsTaskCompleted(int TaskID) Logs::Tasks, "[UPDATE] Comparing completed task %i with %i", completed_tasks[i].task_id, - TaskID); - if (completed_tasks[i].task_id == TaskID) { return 1; } + task_id); + if (completed_tasks[i].task_id == task_id) { return 1; } } return 0; @@ -2680,10 +2680,10 @@ bool TaskManager::IsTaskRepeatable(int task_id) return Task->repeatable; } -bool ClientTaskState::TaskOutOfTime(TaskType type, int Index) +bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) { // Returns true if the Task in the specified slot has a time limit that has been exceeded. - auto info = GetClientTaskInfo(type, Index); + auto info = GetClientTaskInfo(task_type, index); if (info == nullptr) { return false; @@ -2705,14 +2705,14 @@ bool ClientTaskState::TaskOutOfTime(TaskType type, int Index) return (Task->duration && (info->accepted_time + Task->duration <= Now)); } -void ClientTaskState::TaskPeriodicChecks(Client *c) +void ClientTaskState::TaskPeriodicChecks(Client *client) { if (active_task.task_id != TASKSLOTEMPTY) { if (TaskOutOfTime(TaskType::Task, 0)) { // Send Red Task Failed Message - c->SendTaskFailed(active_task.task_id, 0, TaskType::Task); + client->SendTaskFailed(active_task.task_id, 0, TaskType::Task); // Remove the task from the client - c->CancelTask(0, TaskType::Task); + client->CancelTask(0, TaskType::Task); // It is a conscious decision to only fail one task per call to this method, // otherwise the player will not see all the failed messages where multiple // tasks fail at the same time. @@ -2735,9 +2735,9 @@ void ClientTaskState::TaskPeriodicChecks(Client *c) if (TaskOutOfTime(TaskType::Quest, i)) { // Send Red Task Failed Message - c->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); + client->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); // Remove the task from the client - c->CancelTask(i, TaskType::Quest); + client->CancelTask(i, TaskType::Quest); // It is a conscious decision to only fail one task per call to this method, // otherwise the player will not see all the failed messages where multiple // tasks fail at the same time. @@ -2750,7 +2750,7 @@ void ClientTaskState::TaskPeriodicChecks(Client *c) // the zone before we send the 'Task activity_information Completed' message. // if (!checked_touch_activities) { - UpdateTasksOnTouch(c, zone->GetZoneID()); + UpdateTasksOnTouch(client, zone->GetZoneID()); checked_touch_activities = true; } } @@ -2785,14 +2785,14 @@ void Client::SendTaskComplete(int TaskIndex) { } #endif -void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) +void ClientTaskState::SendTaskHistory(Client *client, int task_index) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Task History Requested for Completed Task Index %i", TaskIndex); + Log(Logs::General, Logs::Tasks, "[UPDATE] Task History Requested for Completed Task Index %i", task_index); // We only sent the most recent 50 completed tasks, so we need to offset the Index the client sent to us. - int AdjustedTaskIndex = TaskIndex; + int AdjustedTaskIndex = task_index; if (completed_tasks.size() > 50) { AdjustedTaskIndex += (completed_tasks.size() - 50); @@ -2834,7 +2834,7 @@ void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) ths = (TaskHistoryReplyHeader_Struct *) outapp->pBuffer; // We use the TaskIndex the client sent in the request - ths->TaskID = TaskIndex; + ths->TaskID = task_index; ths->ActivityCount = CompletedActivityCount; @@ -2859,7 +2859,7 @@ void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) } - c->QueuePacket(outapp); + client->QueuePacket(outapp); safe_delete(outapp); @@ -3355,19 +3355,19 @@ void TaskManager::SendActiveTaskDescription( safe_delete(outapp); } -bool ClientTaskState::IsTaskActivityCompleted(TaskType type, int index, int ActivityID) +bool ClientTaskState::IsTaskActivityCompleted(TaskType task_type, int index, int activity_id) { - switch (type) { + switch (task_type) { case TaskType::Task: if (index != 0) { return false; } - return active_task.activity[ActivityID].activity_state == ActivityCompleted; + return active_task.activity[activity_id].activity_state == ActivityCompleted; case TaskType::Shared: return false; // TODO: shared tasks case TaskType::Quest: if (index < MAXACTIVEQUESTS) { - return active_quests[index].activity[ActivityID].activity_state == ActivityCompleted; + return active_quests[index].activity[activity_id].activity_state == ActivityCompleted; } default: return false; @@ -3376,55 +3376,55 @@ bool ClientTaskState::IsTaskActivityCompleted(TaskType type, int index, int Acti } // should we be defaulting to hidden? -ActivityState ClientTaskState::GetTaskActivityState(TaskType type, int index, int ActivityID) +ActivityState ClientTaskState::GetTaskActivityState(TaskType task_type, int index, int activity_id) { - switch (type) { + switch (task_type) { case TaskType::Task: if (index != 0) { return ActivityHidden; } - return active_task.activity[ActivityID].activity_state; + return active_task.activity[activity_id].activity_state; case TaskType::Shared: return ActivityHidden; // TODO: shared tasks case TaskType::Quest: if (index < MAXACTIVEQUESTS) { - return active_quests[index].activity[ActivityID].activity_state; + return active_quests[index].activity[activity_id].activity_state; } default: return ActivityHidden; } } -int ClientTaskState::GetTaskActivityDoneCount(TaskType type, int index, int ActivityID) +int ClientTaskState::GetTaskActivityDoneCount(TaskType task_type, int index, int activity_id) { - switch (type) { + switch (task_type) { case TaskType::Task: if (index != 0) { return 0; } - return active_task.activity[ActivityID].done_count; + return active_task.activity[activity_id].done_count; case TaskType::Shared: return 0; // TODO: shared tasks case TaskType::Quest: if (index < MAXACTIVEQUESTS) { - return active_quests[index].activity[ActivityID].done_count; + return active_quests[index].activity[activity_id].done_count; } default: return 0; } } -int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int TaskID, int ActivityID) +int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id) { - if (active_task.task_id == TaskID) { - return active_task.activity[ActivityID].done_count; + if (active_task.task_id == task_id) { + return active_task.activity[activity_id].done_count; } // TODO: shared tasks int ActiveTaskIndex = -1; for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == TaskID) { + if (active_quests[i].task_id == task_id) { ActiveTaskIndex = i; break; } @@ -3434,17 +3434,17 @@ int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int TaskID, int Activity return 0; } - if (active_quests[ActiveTaskIndex].activity[ActivityID].done_count) { - return active_quests[ActiveTaskIndex].activity[ActivityID].done_count; + if (active_quests[ActiveTaskIndex].activity[activity_id].done_count) { + return active_quests[ActiveTaskIndex].activity[activity_id].done_count; } else { return 0; } } -int ClientTaskState::GetTaskStartTime(TaskType type, int index) +int ClientTaskState::GetTaskStartTime(TaskType task_type, int index) { - switch (type) { + switch (task_type) { case TaskType::Task: return active_task.accepted_time; case TaskType::Quest: @@ -3455,58 +3455,58 @@ int ClientTaskState::GetTaskStartTime(TaskType type, int index) } } -void ClientTaskState::CancelAllTasks(Client *c) +void ClientTaskState::CancelAllTasks(Client *client) { // This method exists solely to be called during #task reloadall // It removes tasks from the in-game client state ready for them to be // resent to the client, in case an updated task fails to load - CancelTask(c, 0, TaskType::Task, false); + CancelTask(client, 0, TaskType::Task, false); active_task.task_id = TASKSLOTEMPTY; for (int i = 0; i < MAXACTIVEQUESTS; i++) if (active_quests[i].task_id != TASKSLOTEMPTY) { - CancelTask(c, i, TaskType::Quest, false); + CancelTask(client, i, TaskType::Quest, false); active_quests[i].task_id = TASKSLOTEMPTY; } // TODO: shared } -void ClientTaskState::CancelTask(Client *c, int SequenceNumber, TaskType type, bool RemoveFromDB) +void ClientTaskState::CancelTask(Client *client, int sequence_number, TaskType task_type, bool remove_from_db) { auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; - cts->SequenceNumber = SequenceNumber; - cts->type = static_cast(type); + cts->SequenceNumber = sequence_number; + cts->type = static_cast(task_type); Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask"); - c->QueuePacket(outapp); + client->QueuePacket(outapp); safe_delete(outapp); - if (RemoveFromDB) { - RemoveTask(c, SequenceNumber, type); + if (remove_from_db) { + RemoveTask(client, sequence_number, task_type); } } -void ClientTaskState::RemoveTask(Client *c, int sequenceNumber, TaskType type) +void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType task_type) { - int characterID = c->CharacterID(); - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState Cancel Task %i ", sequenceNumber); + int characterID = client->CharacterID(); + Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState Cancel Task %i ", sequence_number); int task_id = -1; - switch (type) { + switch (task_type) { case TaskType::Task: - if (sequenceNumber == 0) { + if (sequence_number == 0) { task_id = active_task.task_id; } break; case TaskType::Quest: - if (sequenceNumber < MAXACTIVEQUESTS) { - task_id = active_quests[sequenceNumber].task_id; + if (sequence_number < MAXACTIVEQUESTS) { + task_id = active_quests[sequence_number].task_id; } break; case TaskType::Shared: // TODO: @@ -3528,7 +3528,7 @@ void ClientTaskState::RemoveTask(Client *c, int sequenceNumber, TaskType type) query = StringFormat( "DELETE FROM character_tasks WHERE charid=%i AND taskid = %i AND type=%i", characterID, - task_id, static_cast(type)); + task_id, static_cast(task_type)); results = database.QueryDatabase(query); if (!results.Success()) LogError("[TASKS] Error in CientTaskState::CancelTask [{}]", @@ -3536,14 +3536,14 @@ void ClientTaskState::RemoveTask(Client *c, int sequenceNumber, TaskType type) Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask: %s", query.c_str()); - switch (type) { + switch (task_type) { case TaskType::Task: active_task.task_id = TASKSLOTEMPTY; break; case TaskType::Shared: break; // TODO: shared tasks case TaskType::Quest: - active_quests[sequenceNumber].task_id = TASKSLOTEMPTY; + active_quests[sequence_number].task_id = TASKSLOTEMPTY; active_task_count--; break; default: @@ -3551,10 +3551,10 @@ void ClientTaskState::RemoveTask(Client *c, int sequenceNumber, TaskType type) } } -void ClientTaskState::RemoveTaskByTaskID(Client *c, uint32 task_id) +void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) { auto task_type = p_task_manager->GetTaskType(task_id); - int character_id = c->CharacterID(); + int character_id = client->CharacterID(); Log(Logs::General, Logs::Tasks, "[UPDATE] RemoveTaskByTaskID: %d", task_id); std::string query = fmt::format( "DELETE FROM character_activities WHERE charid = {} AND taskid = {}", @@ -3589,7 +3589,7 @@ void ClientTaskState::RemoveTaskByTaskID(Client *c, uint32 task_id) cts->SequenceNumber = 0; cts->type = static_cast(task_type); LogTasks("[UPDATE] RemoveTaskByTaskID found Task [{}]", task_id); - c->QueuePacket(outapp); + client->QueuePacket(outapp); safe_delete(outapp); active_task.task_id = TASKSLOTEMPTY; } @@ -3608,7 +3608,7 @@ void ClientTaskState::RemoveTaskByTaskID(Client *c, uint32 task_id) LogTasks("[UPDATE] RemoveTaskByTaskID found Quest [{}] at index [{}]", task_id, active_quest); active_quests[active_quest].task_id = TASKSLOTEMPTY; active_task_count--; - c->QueuePacket(outapp); + client->QueuePacket(outapp); safe_delete(outapp); } } @@ -3619,17 +3619,17 @@ void ClientTaskState::RemoveTaskByTaskID(Client *c, uint32 task_id) } } -void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enforce_level_requirement) +void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id, bool enforce_level_requirement) { - if (!p_task_manager || TaskID < 0 || TaskID >= MAXTASKS) { - c->Message(Chat::Red, "Task system not functioning, or task_id %i out of range.", TaskID); + if (!p_task_manager || task_id < 0 || task_id >= MAXTASKS) { + client->Message(Chat::Red, "Task system not functioning, or task_id %i out of range.", task_id); return; } - auto task = p_task_manager->p_task_data[TaskID]; + auto task = p_task_manager->p_task_data[task_id]; if (task == nullptr) { - c->Message(Chat::Red, "Invalid task_id %i", TaskID); + client->Message(Chat::Red, "Invalid task_id %i", task_id); return; } @@ -3655,26 +3655,26 @@ void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enfor } if (max_tasks) { - c->Message(Chat::Red, "You already have the maximum allowable number of active tasks (%i)", MAXACTIVEQUESTS); + client->Message(Chat::Red, "You already have the maximum allowable number of active tasks (%i)", MAXACTIVEQUESTS); return; } // only Quests can have more than one, so don't need to check others if (task->type == TaskType::Quest) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == TaskID) { - c->Message(Chat::Red, "You have already been assigned this task."); + if (active_quests[i].task_id == task_id) { + client->Message(Chat::Red, "You have already been assigned this task."); return; } } } - if (enforce_level_requirement && !p_task_manager->ValidateLevel(TaskID, c->GetLevel())) { - c->Message(Chat::Red, "You are outside the level range of this task."); + if (enforce_level_requirement && !p_task_manager->ValidateLevel(task_id, client->GetLevel())) { + client->Message(Chat::Red, "You are outside the level range of this task."); return; } - if (!p_task_manager->IsTaskRepeatable(TaskID) && IsTaskCompleted(TaskID)) { + if (!p_task_manager->IsTaskRepeatable(task_id) && IsTaskCompleted(task_id)) { return; } @@ -3708,60 +3708,60 @@ void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enfor // This shouldn't happen unless there is a bug in the handling of ActiveTaskCount somewhere if (active_slot == nullptr) { - c->Message(Chat::Red, "You already have the maximum allowable number of active tasks (%i)", MAXACTIVEQUESTS); + client->Message(Chat::Red, "You already have the maximum allowable number of active tasks (%i)", MAXACTIVEQUESTS); return; } - active_slot->task_id = TaskID; + active_slot->task_id = task_id; active_slot->accepted_time = time(nullptr); active_slot->updated = true; active_slot->current_step = -1; - for (int i = 0; i < p_task_manager->p_task_data[TaskID]->activity_count; i++) { + for (int i = 0; i < p_task_manager->p_task_data[task_id]->activity_count; i++) { active_slot->activity[i].activity_id = i; active_slot->activity[i].done_count = 0; active_slot->activity[i].activity_state = ActivityHidden; active_slot->activity[i].updated = true; } - UnlockActivities(c->CharacterID(), *active_slot); + UnlockActivities(client->CharacterID(), *active_slot); if (task->type == TaskType::Quest) { active_task_count++; } - p_task_manager->SendSingleActiveTaskToClient(c, *active_slot, false, true); - c->Message(Chat::White, "You have been assigned the task '%s'.", p_task_manager->p_task_data[TaskID]->title.c_str()); - p_task_manager->SaveClientState(c, this); - std::string buf = std::to_string(TaskID); + p_task_manager->SendSingleActiveTaskToClient(client, *active_slot, false, true); + client->Message(Chat::White, "You have been assigned the task '%s'.", p_task_manager->p_task_data[task_id]->title.c_str()); + p_task_manager->SaveClientState(client, this); + std::string buf = std::to_string(task_id); - NPC *npc = entity_list.GetID(NPCID)->CastToNPC(); + NPC *npc = entity_list.GetID(npc_type_id)->CastToNPC(); if (npc) { - parse->EventNPC(EVENT_TASK_ACCEPTED, npc, c, buf.c_str(), 0); + parse->EventNPC(EVENT_TASK_ACCEPTED, npc, client, buf.c_str(), 0); } } -void ClientTaskState::ProcessTaskProximities(Client *c, float X, float Y, float Z) +void ClientTaskState::ProcessTaskProximities(Client *client, float x, float y, float z) { - float LastX = c->ProximityX(); - float LastY = c->ProximityY(); - float LastZ = c->ProximityZ(); + float LastX = client->ProximityX(); + float LastY = client->ProximityY(); + float LastZ = client->ProximityZ(); - if ((LastX == X) && (LastY == Y) && (LastZ == Z)) { return; } + if ((LastX == x) && (LastY == y) && (LastZ == z)) { return; } - Log(Logs::General, Logs::Tasks, "[PROXIMITY] Checking proximities for Position %8.3f, %8.3f, %8.3f", X, Y, Z); - int ExploreID = p_task_manager->proximity_manager.CheckProximities(X, Y, Z); + Log(Logs::General, Logs::Tasks, "[PROXIMITY] Checking proximities for Position %8.3f, %8.3f, %8.3f", x, y, z); + int ExploreID = p_task_manager->proximity_manager.CheckProximities(x, y, z); if (ExploreID > 0) { Log(Logs::General, Logs::Tasks, "[PROXIMITY] Position %8.3f, %8.3f, %8.3f is within proximity %i", - X, - Y, - Z, + x, + y, + z, ExploreID); - UpdateTasksOnExplore(c, ExploreID); + UpdateTasksOnExplore(client, ExploreID); } } diff --git a/zone/tasks.h b/zone/tasks.h index af95cda63..36ff62bc2 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -220,46 +220,46 @@ class ClientTaskState { public: ClientTaskState(); ~ClientTaskState(); - void ShowClientTasks(Client *c); + void ShowClientTasks(Client *client); inline int GetActiveTaskCount() { return active_task_count; } int GetActiveTaskID(int index); - bool IsTaskActivityCompleted(TaskType type, int index, int ActivityID); - int GetTaskActivityDoneCount(TaskType type, int index, int ActivityID); - int GetTaskActivityDoneCountFromTaskID(int TaskID, int ActivityID); - int GetTaskStartTime(TaskType type, int index); - void AcceptNewTask(Client *c, int TaskID, int NPCID, bool enforce_level_requirement = false); - void FailTask(Client *c, int TaskID); - int TaskTimeLeft(int TaskID); - int IsTaskCompleted(int TaskID); - bool IsTaskActive(int TaskID); - bool IsTaskActivityActive(int TaskID, int ActivityID); - ActivityState GetTaskActivityState(TaskType type, int index, int ActivityID); - void UpdateTaskActivity(Client *c, int TaskID, int ActivityID, int Count, bool ignore_quest_update = false); - void ResetTaskActivity(Client *c, int TaskID, int ActivityID); - void CancelTask(Client *c, int SequenceNumber, TaskType type, bool RemoveFromDB = true); - void CancelAllTasks(Client *c); - void RemoveTask(Client *c, int SequenceNumber, TaskType type); - void RemoveTaskByTaskID(Client *c, uint32 task_id); - bool UpdateTasksByNPC(Client *c, int activity_type, int npc_type_id); - void UpdateTasksOnKill(Client *c, int NPCTypeID); - void UpdateTasksForItem(Client *c, ActivityType Type, int ItemID, int Count = 1); - void UpdateTasksOnExplore(Client *c, int ExploreID); - bool UpdateTasksOnSpeakWith(Client *c, int NPCTypeID); - bool UpdateTasksOnDeliver(Client *c, std::list &Items, int Cash, int NPCTypeID); - void UpdateTasksOnTouch(Client *c, int ZoneID); - void ProcessTaskProximities(Client *c, float X, float Y, float Z); - bool TaskOutOfTime(TaskType type, int Index); - void TaskPeriodicChecks(Client *c); - void SendTaskHistory(Client *c, int TaskIndex); - void RewardTask(Client *c, TaskInformation *Task); - void EnableTask(int character_id, int task_count, int *TaskList); + bool IsTaskActivityCompleted(TaskType task_type, int index, int activity_id); + int GetTaskActivityDoneCount(TaskType task_type, int index, int activity_id); + int GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id); + int GetTaskStartTime(TaskType task_type, int index); + void AcceptNewTask(Client *client, int task_id, int npc_type_id, bool enforce_level_requirement = false); + void FailTask(Client *client, int task_id); + int TaskTimeLeft(int task_id); + int IsTaskCompleted(int task_id); + bool IsTaskActive(int task_id); + bool IsTaskActivityActive(int task_id, int activity_id); + ActivityState GetTaskActivityState(TaskType task_type, int index, int activity_id); + void UpdateTaskActivity(Client *client, int task_id, int activity_id, int count, bool ignore_quest_update = false); + void ResetTaskActivity(Client *client, int task_id, int activity_id); + void CancelTask(Client *client, int sequence_number, TaskType task_type, bool remove_from_db = true); + void CancelAllTasks(Client *client); + void RemoveTask(Client *client, int sequence_number, TaskType task_type); + void RemoveTaskByTaskID(Client *client, uint32 task_id); + bool UpdateTasksByNPC(Client *client, int activity_type, int npc_type_id); + void UpdateTasksOnKill(Client *client, int npc_type_id); + void UpdateTasksForItem(Client *client, ActivityType activity_type, int item_id, int count = 1); + void UpdateTasksOnExplore(Client *client, int explore_id); + bool UpdateTasksOnSpeakWith(Client *client, int npc_type_id); + bool UpdateTasksOnDeliver(Client *client, std::list &items, int cash, int npc_type_id); + void UpdateTasksOnTouch(Client *client, int zone_id); + void ProcessTaskProximities(Client *client, float x, float y, float z); + bool TaskOutOfTime(TaskType task_type, int index); + void TaskPeriodicChecks(Client *client); + void SendTaskHistory(Client *client, int task_index); + void RewardTask(Client *client, TaskInformation *task_information); + void EnableTask(int character_id, int task_count, int *task_list); void DisableTask(int character_id, int task_count, int *task_list); - bool IsTaskEnabled(int TaskID); - int EnabledTaskCount(int TaskSetID); + bool IsTaskEnabled(int task_id); + int EnabledTaskCount(int task_set_id); int ActiveSpeakTask(int npc_type_id); int ActiveSpeakActivity(int npc_type_id, int task_id); - int ActiveTasksInSet(int TaskSetID); - int CompletedTasksInSet(int TaskSetID); + int ActiveTasksInSet(int task_set_id); + int CompletedTasksInSet(int task_set_id); bool HasSlotForTask(TaskInformation *task); inline bool HasFreeTaskSlot() { return active_task.task_id == TASKSLOTEMPTY; } From c194e2ac9cd13ead921f81a1c8a094cc1ff759df Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 01:22:22 -0600 Subject: [PATCH 04/26] Fix linux compile warnings --- zone/worldserver.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index a5772608f..5540d89ec 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -2455,7 +2455,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) CZTaskDisablePlayer_Struct* CZUA = (CZTaskDisablePlayer_Struct*) pack->pBuffer; auto client = entity_list.GetClientByCharID(CZUA->character_id); if (client) { - client->DisableTask(1, (int*) CZUA->task_id); + client->DisableTask(1, reinterpret_cast(CZUA->task_id)); } break; } @@ -2467,7 +2467,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { auto group_member = client_group->members[member_index]->CastToClient(); - group_member->DisableTask(1, (int*) CZUA->task_id); + group_member->DisableTask(1, reinterpret_cast(CZUA->task_id)); } } } @@ -2481,7 +2481,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { auto raid_member = client_raid->members[member_index].member->CastToClient(); - raid_member->DisableTask(1, (int*) CZUA->task_id); + raid_member->DisableTask(1, reinterpret_cast(CZUA->task_id)); } } } @@ -2492,7 +2492,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) CZTaskDisableGuild_Struct* CZUA = (CZTaskDisableGuild_Struct*) pack->pBuffer; for (auto &client : entity_list.GetClientList()) { if (client.second->GuildID() > 0 && client.second->GuildID() == CZUA->guild_id) { - client.second->DisableTask(1, (int*) CZUA->task_id); + client.second->DisableTask(1, reinterpret_cast(CZUA->task_id)); } } break; @@ -2502,7 +2502,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) CZTaskEnablePlayer_Struct* CZUA = (CZTaskEnablePlayer_Struct*) pack->pBuffer; auto client = entity_list.GetClientByCharID(CZUA->character_id); if (client) { - client->EnableTask(1, (int*) CZUA->task_id); + client->EnableTask(1, reinterpret_cast(CZUA->task_id)); } break; } @@ -2514,7 +2514,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { auto group_member = client_group->members[member_index]->CastToClient(); - group_member->EnableTask(1, (int*) CZUA->task_id); + group_member->EnableTask(1, reinterpret_cast(CZUA->task_id)); } } } @@ -2528,7 +2528,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { auto raid_member = client_raid->members[member_index].member->CastToClient(); - raid_member->EnableTask(1, (int*) CZUA->task_id); + raid_member->EnableTask(1, reinterpret_cast(CZUA->task_id)); } } } @@ -2539,7 +2539,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) CZTaskEnableGuild_Struct* CZUA = (CZTaskEnableGuild_Struct*) pack->pBuffer; for (auto &client : entity_list.GetClientList()) { if (client.second->GuildID() > 0 && client.second->GuildID() == CZUA->guild_id) { - client.second->EnableTask(1, (int*) CZUA->task_id); + client.second->EnableTask(1, reinterpret_cast(CZUA->task_id)); } } break; @@ -2666,7 +2666,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) for (auto &client : entity_list.GetClientList()) { auto client_status = client.second->Admin(); if (client_status >= WWDT->min_status && (client_status <= WWDT->max_status || WWDT->max_status == 0)) { - client.second->DisableTask(1, (int *) WWDT->task_id); + client.second->DisableTask(1, reinterpret_cast(WWDT->task_id)); } } break; @@ -2677,7 +2677,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) for (auto &client : entity_list.GetClientList()) { auto client_status = client.second->Admin(); if (client_status >= WWET->min_status && (client_status <= WWET->max_status || WWET->max_status == 0)) { - client.second->EnableTask(1, (int *) WWET->task_id); + client.second->EnableTask(1, reinterpret_cast(WWET->task_id)); } } break; From 8d863a507ba354d102a05fde40e3ce7b57f825e6 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 01:25:03 -0600 Subject: [PATCH 05/26] Fourth pass --- zone/tasks.cpp | 552 +++++++++++++++++++++++++++++-------------------- zone/tasks.h | 81 +++----- 2 files changed, 366 insertions(+), 267 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index b188b61a7..2a54c0113 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -46,13 +46,13 @@ extern QueryServ *QServ; TaskManager::TaskManager() { - for (auto & Task : p_task_data) + for (auto &Task : p_task_data) Task = nullptr; } TaskManager::~TaskManager() { - for (auto & Task : p_task_data) { + for (auto &Task : p_task_data) { if (Task != nullptr) { safe_delete(Task); } @@ -64,7 +64,7 @@ bool TaskManager::LoadTaskSets() // Clear all task sets in memory. Done so we can reload them on the fly if required by just calling // this method again. - for (auto & TaskSet : task_sets) + for (auto &TaskSet : task_sets) TaskSet.clear(); std::string query = StringFormat( @@ -164,11 +164,16 @@ bool TaskManager::LoadTasks(int single_task) p_task_data[taskID]->sequence_mode = ActivitiesSequential; p_task_data[taskID]->last_step = 0; - Log(Logs::General, Logs::Tasks, + Log(Logs::General, + Logs::Tasks, "[GLOBALLOAD] task_id: %5i, duration: %8i, reward: %s min_level %i max_level %i " "repeatable: %s", - taskID, p_task_data[taskID]->duration, p_task_data[taskID]->reward.c_str(), - p_task_data[taskID]->min_level, p_task_data[taskID]->max_level, p_task_data[taskID]->repeatable ? "Yes" : "No"); + taskID, + p_task_data[taskID]->duration, + p_task_data[taskID]->reward.c_str(), + p_task_data[taskID]->min_level, + p_task_data[taskID]->max_level, + p_task_data[taskID]->repeatable ? "Yes" : "No"); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] title: %s", p_task_data[taskID]->title.c_str()); } @@ -206,19 +211,22 @@ bool TaskManager::LoadTasks(int single_task) if ((taskID <= 0) || (taskID >= MAXTASKS) || (activityID < 0) || (activityID >= MAXACTIVITIESPERTASK)) { // This shouldn't happen, as the SELECT is bounded by MAXTASKS - LogError("[TASKS]Task or activity_information ID ([{}], [{}]) out of range while loading activities from database", - taskID, - activityID); + LogError( + "[TASKS]Task or activity_information ID ([{}], [{}]) out of range while loading activities from database", + taskID, + activityID); continue; } if (p_task_data[taskID] == nullptr) { - LogError("[TASKS]activity_information for non-existent task ([{}], [{}]) while loading activities from database", - taskID, activityID); + LogError( + "[TASKS]activity_information for non-existent task ([{}], [{}]) while loading activities from database", + taskID, + activityID); continue; } - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].StepNumber = step; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].step_number = step; if (step != 0) { p_task_data[taskID]->sequence_mode = ActivitiesStepped; @@ -239,34 +247,42 @@ bool TaskManager::LoadTasks(int single_task) continue; } - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].Type = atoi(row[3]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].activity_type = atoi(row[3]); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].target_name = row[4]; - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].item_list = row[5]; - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].skill_list = row[6]; - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].skill_id = atoi(row[6]); // for older clients - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_list = row[7]; - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_id = atoi(row[7]); // for older clients - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].desc_override = row[8]; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].target_name = row[4]; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].item_list = row[5]; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].skill_list = row[6]; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].skill_id = atoi(row[6]); // for older clients + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_list = row[7]; + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_id = atoi(row[7]); // for older clients + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].description_override = row[8]; - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalID = atoi(row[9]); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalMethod = (TaskMethodType) atoi(row[10]); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalCount = atoi(row[11]); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].DeliverToNPC = atoi(row[12]); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones = row[13]; - auto zones = SplitString(p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones, ';'); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_id = atoi(row[9]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_method = (TaskMethodType) atoi( + row[10] + ); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_count = atoi(row[11]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].deliver_to_npc = atoi(row[12]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones = row[13]; + auto zones = SplitString( + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones, + ';' + ); for (auto &&e : zones) - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].ZoneIDs.push_back(std::stoi(e)); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].Optional = atoi(row[14]); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zone_ids.push_back( + std::stoi( + e + )); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].optional = atoi(row[14]); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] activity_information Slot %2i: ID %i for Task %5i. Type: %3i, GoalID: %8i, " "GoalMethod: %i, GoalCount: %3i, Zones:%s", p_task_data[taskID]->activity_count, activityID, taskID, - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].Type, - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalID, - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalMethod, - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].GoalCount, + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].activity_type, + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_id, + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_method, + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_count, p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] target_name: %s", @@ -278,7 +294,7 @@ bool TaskManager::LoadTasks(int single_task) Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] spell_list: %s", p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_list.c_str()); Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] description_override: %s", - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].desc_override.c_str()); + p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].description_override.c_str()); p_task_data[taskID]->activity_count++; } @@ -302,8 +318,9 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s Log(Logs::Detail, Logs::Tasks, "TaskManager::SaveClientState for character ID %d", characterID); - if (client_task_state->active_task_count > 0 || client_task_state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks - for (auto & ActiveTask : client_task_state->ActiveTasks) { + if (client_task_state->active_task_count > 0 || + client_task_state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks + for (auto &ActiveTask : client_task_state->ActiveTasks) { int taskID = ActiveTask.task_id; if (taskID == TASKSLOTEMPTY) { continue; @@ -384,7 +401,7 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s } ActiveTask.updated = false; - for (int activityIndex = 0; + for (int activityIndex = 0; activityIndex < p_task_data[taskID]->activity_count; ++activityIndex) ActiveTask.activity[activityIndex].updated = false; @@ -400,7 +417,9 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s const char *completedTaskQuery = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " "VALUES (%i, %i, %i, %i)"; - for (unsigned int i = client_task_state->last_completed_task_loaded; i < client_task_state->completed_tasks.size(); i++) { + for (unsigned int i = client_task_state->last_completed_task_loaded; + i < client_task_state->completed_tasks.size(); + i++) { Log(Logs::General, Logs::Tasks, "[CLIENTSAVE] TaskManager::SaveClientState Saving Completed Task at slot %i", i); @@ -436,7 +455,8 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s // Insert one record for each completed optional task. for (int j = 0; j < p_task_data[taskID]->activity_count; j++) { - if (!p_task_data[taskID]->activity_information[j].Optional || !client_task_state->completed_tasks[i].activity_done[j]) { + if (!p_task_data[taskID]->activity_information[j].optional || + !client_task_state->completed_tasks[i].activity_done[j]) { continue; } @@ -533,7 +553,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s task_info->accepted_time = accepted_time; task_info->updated = false; - for (auto & i : task_info->activity) { + for (auto &i : task_info->activity) { i.activity_id = -1; } @@ -541,7 +561,10 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s ++client_task_state->active_task_count; } - LogTasks("[LoadClientState] character_id [{}] task_id [{}] accepted_time [{}]", character_id, task_id, accepted_time); + LogTasks("[LoadClientState] character_id [{}] task_id [{}] accepted_time [{}]", + character_id, + task_id, + accepted_time); } // Load Activities @@ -588,7 +611,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s // wasn't task if (task_info == nullptr) { - for (auto & active_quest : client_task_state->active_quests) { + for (auto &active_quest : client_task_state->active_quests) { if (active_quest.task_id == task_id) { task_info = &active_quest; } @@ -642,7 +665,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s } CompletedTaskInformation completed_task_information{}; - for (bool & i : completed_task_information.activity_done) + for (bool &i : completed_task_information.activity_done) i = false; int previous_task_id = -1; @@ -662,7 +685,8 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s // completed. int activity_id = atoi(row[1]); if ((activity_id < -1) || (activity_id >= MAXACTIVITIESPERTASK)) { - LogError("[TASKS]activity_information ID [{}] out of range while loading completed tasks from database", activity_id); + LogError("[TASKS]activity_information ID [{}] out of range while loading completed tasks from database", + activity_id); continue; } @@ -670,7 +694,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s if ((previous_task_id != -1) && ((task_id != previous_task_id) || (completed_time != previous_completed_time))) { client_task_state->completed_tasks.push_back(completed_task_information); - for (bool & activity_done : completed_task_information.activity_done) { + for (bool &activity_done : completed_task_information.activity_done) { activity_done = false; } } @@ -686,7 +710,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s } for (int i = 0; i < task->activity_count; i++) { - if (!task->activity_information[i].Optional) { + if (!task->activity_information[i].optional) { completed_task_information.activity_done[i] = true; } } @@ -764,13 +788,13 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s } // TODO: shared - for (auto & active_quest : client_task_state->active_quests) { + for (auto &active_quest : client_task_state->active_quests) { if (active_quest.task_id != TASKSLOTEMPTY) { client_task_state->UnlockActivities(character_id, active_quest); } } - LogTasks( "[LoadClientState] for Character ID [{}}] DONE!", character_id); + LogTasks("[LoadClientState] for Character ID [{}}] DONE!", character_id); return true; } @@ -917,7 +941,8 @@ int ClientTaskState::EnabledTaskCount(int task_set_id) if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } - while ((EnabledTaskIndex < enabled_tasks.size()) && (TaskSetIndex < p_task_manager->task_sets[task_set_id].size())) { + while ((EnabledTaskIndex < enabled_tasks.size()) && + (TaskSetIndex < p_task_manager->task_sets[task_set_id].size())) { if (enabled_tasks[EnabledTaskIndex] == p_task_manager->task_sets[task_set_id][TaskSetIndex]) { @@ -1088,14 +1113,20 @@ void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_s int TaskListIndex = 0; int PlayerLevel = client->GetLevel(); - LogTasks("TaskSetSelector called for taskset [{}]. EnableTaskSize is [{}]", task_set_id, client_task_state->enabled_tasks.size()); + LogTasks("TaskSetSelector called for taskset [{}]. EnableTaskSize is [{}]", + task_set_id, + client_task_state->enabled_tasks.size()); if (task_set_id <= 0 || task_set_id >= MAXTASKSETS) { return; } if (task_sets[task_set_id].empty()) { - mob->SayString(client, Chat::Yellow, MAX_ACTIVE_TASKS, client->GetName()); // I think this is suppose to be yellow + mob->SayString( + client, + Chat::Yellow, + MAX_ACTIVE_TASKS, + client->GetName()); // I think this is suppose to be yellow return; } @@ -1143,7 +1174,8 @@ void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_s // unlike the non-Quest version of this function, it does not check enabled, that is assumed the responsibility of the quest to handle // we do however still want it to check the other stuff like level, active, room, etc -void TaskManager::TaskQuestSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int count, int *tasks) +void +TaskManager::TaskQuestSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int count, int *tasks) { int task_list[MAXCHOOSERENTRIES]; int task_list_index = 0; @@ -1159,7 +1191,8 @@ void TaskManager::TaskQuestSetSelector(Client *client, ClientTaskState *client_t auto task = tasks[i]; // verify level, we're not currently on it, repeatable status, if it's a (shared) task // we aren't currently on another, and if it's enabled if not all_enabled - if (ValidateLevel(task, player_level) && !client_task_state->IsTaskActive(task) && client_task_state->HasSlotForTask(p_task_data[task]) && + if (ValidateLevel(task, player_level) && !client_task_state->IsTaskActive(task) && + client_task_state->HasSlotForTask(p_task_data[task]) && // this slot checking is a bit silly, but we allow mixing of task types ... (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { task_list[task_list_index++] = task; @@ -1258,15 +1291,15 @@ void TaskManager::SendTaskSelector(Client *client, Mob *mob, int task_count, int for (int j = 0; j < p_task_data[task_list[i]]->activity_count; ++j) { buf.WriteUInt32(j); // ActivityNumber auto &activity = p_task_data[task_list[i]]->activity_information[j]; - buf.WriteUInt32(activity.Type); + buf.WriteUInt32(activity.activity_type); buf.WriteUInt32(0); // solo, group, raid? buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) buf.WriteString(activity.item_list); // max length 64 in these clients - buf.WriteUInt32(activity.GoalCount); + buf.WriteUInt32(activity.goal_count); buf.WriteInt32(activity.skill_id); buf.WriteInt32(activity.spell_id); - buf.WriteInt32(activity.ZoneIDs.empty() ? 0 : activity.ZoneIDs.front()); - buf.WriteString(activity.desc_override); + buf.WriteInt32(activity.zone_ids.empty() ? 0 : activity.zone_ids.front()); + buf.WriteString(activity.description_override); } } @@ -1342,14 +1375,14 @@ void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, for (int j = 0; j < p_task_data[task_list[i]]->activity_count; ++j) { buf.WriteUInt32(j); // ActivityNumber auto &activity = p_task_data[task_list[i]]->activity_information[j]; - buf.WriteUInt32(activity.Type); // ActivityType + buf.WriteUInt32(activity.activity_type); // ActivityType buf.WriteUInt32(0); // solo, group, raid? buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) // this string is item names buf.WriteLengthString(activity.item_list); - buf.WriteUInt32(activity.GoalCount); // GoalCount + buf.WriteUInt32(activity.goal_count); // GoalCount // this string is skill IDs? probably one of the "use on" tasks buf.WriteLengthString(activity.skill_list); @@ -1359,7 +1392,7 @@ void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, //buf.WriteString(itoa(Tasks[TaskList[i]]->activity_information[activity_id].ZoneID)); buf.WriteString(activity.zones); // Zone number in ascii max length 64, can be multiple with separated by ; - buf.WriteString(activity.desc_override); // max length 128 -- overrides the automatic descriptions + buf.WriteString(activity.description_override); // max length 128 -- overrides the automatic descriptions // this doesn't appear to be shown to the client at all and isn't the same as zones ... defaults to '0' though buf.WriteString(activity.zones); // Zone number in ascii max length 64, probably can be separated by ; too, haven't found it used } @@ -1412,7 +1445,7 @@ void TaskManager::ExplainTask(Client *client, int task_id) sprintf(ptr, "Act: %3i: ", i); ptr = ptr + strlen(ptr); - switch (p_task_data[task_id]->activity_information[i].Type) { + switch (p_task_data[task_id]->activity_information[i].activity_type) { case ActivityDeliver: sprintf(ptr, "Deliver"); break; @@ -1428,11 +1461,11 @@ ClientTaskState::ClientTaskState() checked_touch_activities = false; for (int i = 0; i < MAXACTIVEQUESTS; i++) { - active_quests[i].slot = i; + active_quests[i].slot = i; active_quests[i].task_id = TASKSLOTEMPTY; } - active_task.slot = 0; + active_task.slot = 0; active_task.task_id = TASKSLOTEMPTY; // TODO: shared task } @@ -1490,7 +1523,7 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & // Enable the next Hidden task. for (int i = 0; i < p_task_information->activity_count; i++) { if ((task_info.activity[i].activity_state == ActivityActive) && - (!p_task_information->activity_information[i].Optional)) { + (!p_task_information->activity_information[i].optional)) { all_activities_complete = false; break; } @@ -1531,7 +1564,8 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & completed_task_information.completed_time = time(nullptr); for (int i = 0; i < p_task_information->activity_count; i++) { - completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == ActivityCompleted); + completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == + ActivityCompleted); } completed_tasks.push_back(completed_task_information); @@ -1554,7 +1588,8 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & if (task_info.current_step == -1) { for (int i = 0; i < p_task_information->activity_count; i++) { - if (p_task_information->activity_information[i].StepNumber == 0 && task_info.activity[i].activity_state == ActivityHidden) { + if (p_task_information->activity_information[i].step_number == 0 && + task_info.activity[i].activity_state == ActivityHidden) { task_info.activity[i].activity_state = ActivityActive; // task_info.activity_information[i].updated=true; } @@ -1564,9 +1599,9 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & for (int Step = task_info.current_step; Step <= p_task_information->last_step; Step++) { for (int Activity = 0; Activity < p_task_information->activity_count; Activity++) { - if (p_task_information->activity_information[Activity].StepNumber == (int) task_info.current_step) { + if (p_task_information->activity_information[Activity].step_number == (int) task_info.current_step) { if ((task_info.activity[Activity].activity_state != ActivityCompleted) && - (!p_task_information->activity_information[Activity].Optional)) { + (!p_task_information->activity_information[Activity].optional)) { CurrentStepComplete = false; all_activities_complete = false; break; @@ -1612,9 +1647,10 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & completed_task_information.completed_time = time(nullptr); for (int i = 0; i < p_task_information->activity_count; i++) { - completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == ActivityCompleted); + completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == + ActivityCompleted); } - + completed_tasks.push_back(completed_task_information); } return true; @@ -1622,7 +1658,7 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & // Mark all non-completed tasks in the current step as active for (int activity = 0; activity < p_task_information->activity_count; activity++) { - if ((p_task_information->activity_information[activity].StepNumber == (int) task_info.current_step) && + if ((p_task_information->activity_information[activity].step_number == (int) task_info.current_step) && (task_info.activity[activity].activity_state == ActivityHidden)) { task_info.activity[activity].activity_state = ActivityActive; task_info.activity[activity].updated = true; @@ -1653,7 +1689,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np } // loop over the union of tasks and quests - for (auto & ActiveTask : ActiveTasks) { + for (auto &ActiveTask : ActiveTasks) { auto current_task = &ActiveTask; if (current_task->task_id == TASKSLOTEMPTY) { continue; @@ -1671,7 +1707,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np continue; } // We are only interested in Kill activities - if (p_task_information->activity_information[activity_id].Type != activity_type) { + if (p_task_information->activity_information[activity_id].activity_type != activity_type) { continue; } // Is there a zone restriction on the activity_information ? @@ -1687,15 +1723,18 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np continue; } // Is the activity_information to kill this type of NPC ? - switch (p_task_information->activity_information[activity_id].GoalMethod) { + switch (p_task_information->activity_information[activity_id].goal_method) { case METHODSINGLEID: - if (p_task_information->activity_information[activity_id].GoalID != npc_type_id) { + if (p_task_information->activity_information[activity_id].goal_id != npc_type_id) { continue; } break; case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList(p_task_information->activity_information[activity_id].GoalID, npc_type_id)) { + if (!p_task_manager->goal_list_manager.IsInList( + p_task_information->activity_information[activity_id].goal_id, + npc_type_id + )) { continue; } break; @@ -1724,7 +1763,7 @@ int ClientTaskState::ActiveSpeakTask(int npc_type_id) } // loop over the union of tasks and quests - for (auto & active_task : ActiveTasks) { + for (auto &active_task : ActiveTasks) { auto current_task = &active_task; if (current_task->task_id == TASKSLOTEMPTY) { continue; @@ -1740,7 +1779,7 @@ int ClientTaskState::ActiveSpeakTask(int npc_type_id) if (current_task->activity[activity_id].activity_state != ActivityActive) { continue; } - if (p_task_information->activity_information[activity_id].Type != ActivitySpeakWith) { + if (p_task_information->activity_information[activity_id].activity_type != ActivitySpeakWith) { continue; } // Is there a zone restriction on the activity_information ? @@ -1748,7 +1787,8 @@ int ClientTaskState::ActiveSpeakTask(int npc_type_id) continue; } // Is the activity_information to speak with this type of NPC ? - if (p_task_information->activity_information[activity_id].GoalMethod == METHODQUEST && p_task_information->activity_information[activity_id].GoalID == npc_type_id) { + if (p_task_information->activity_information[activity_id].goal_method == METHODQUEST && + p_task_information->activity_information[activity_id].goal_id == npc_type_id) { return current_task->task_id; } } @@ -1769,7 +1809,7 @@ int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) } // loop over the union of tasks and quests - for (auto & ActiveTask : ActiveTasks) { + for (auto &ActiveTask : ActiveTasks) { auto current_task = &ActiveTask; if (current_task->task_id != task_id) { continue; @@ -1785,7 +1825,7 @@ int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) if (current_task->activity[activity_index].activity_state != ActivityActive) { continue; } - if (p_task_information->activity_information[activity_index].Type != ActivitySpeakWith) { + if (p_task_information->activity_information[activity_index].activity_type != ActivitySpeakWith) { continue; } // Is there a zone restriction on the activity_information ? @@ -1793,8 +1833,8 @@ int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) continue; } // Is the activity_information to speak with this type of NPC ? - if (p_task_information->activity_information[activity_index].GoalMethod == METHODQUEST && - p_task_information->activity_information[activity_index].GoalID == npc_type_id) { + if (p_task_information->activity_information[activity_index].goal_method == METHODQUEST && + p_task_information->activity_information[activity_index].goal_id == npc_type_id) { return activity_index; } } @@ -1840,25 +1880,32 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t continue; } // We are only interested in the ActivityType we were called with - if (Task->activity_information[j].Type != (int) activity_type) { + if (Task->activity_information[j].activity_type != (int) activity_type) { continue; } // Is there a zone restriction on the activity_information ? if (!Task->activity_information[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s activity_information type %i for Item %i failed zone check", - client->GetName(), activity_type, item_id); + Log(Logs::General, + Logs::Tasks, + "[UPDATE] Char: %s activity_information type %i for Item %i failed zone check", + client->GetName(), + activity_type, + item_id); continue; } // Is the activity_information related to this item ? // - switch (Task->activity_information[j].GoalMethod) { + switch (Task->activity_information[j].goal_method) { case METHODSINGLEID: - if (Task->activity_information[j].GoalID != item_id) { continue; } + if (Task->activity_information[j].goal_id != item_id) { continue; } break; case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList(Task->activity_information[j].GoalID, item_id)) { continue; } + if (!p_task_manager->goal_list_manager.IsInList( + Task->activity_information[j].goal_id, + item_id + )) { continue; } break; default: @@ -1905,7 +1952,7 @@ void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) continue; } // We are only interested in explore activities - if (Task->activity_information[j].Type != ActivityExplore) { + if (Task->activity_information[j].activity_type != ActivityExplore) { continue; } if (!Task->activity_information[j].CheckZone(zone->GetZoneID())) { @@ -1915,16 +1962,19 @@ void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) continue; } // Is the activity_information to explore this area id ? - switch (Task->activity_information[j].GoalMethod) { + switch (Task->activity_information[j].goal_method) { case METHODSINGLEID: - if (Task->activity_information[j].GoalID != explore_id) { + if (Task->activity_information[j].goal_id != explore_id) { continue; } break; case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList(Task->activity_information[j].GoalID, explore_id)) { + if (!p_task_manager->goal_list_manager.IsInList( + Task->activity_information[j].goal_id, + explore_id + )) { continue; } break; @@ -1938,7 +1988,7 @@ void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on explore"); IncrementDoneCount( client, Task, cur_task->slot, j, - Task->activity_information[j].GoalCount - cur_task->activity[j].done_count + Task->activity_information[j].goal_count - cur_task->activity[j].done_count ); } } @@ -1946,7 +1996,8 @@ void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) return; } -bool ClientTaskState::UpdateTasksOnDeliver(Client *client, std::list &items, int cash, int npc_type_id) +bool +ClientTaskState::UpdateTasksOnDeliver(Client *client, std::list &items, int cash, int npc_type_id) { bool Ret = false; @@ -1977,7 +2028,8 @@ bool ClientTaskState::UpdateTasksOnDeliver(Client *client, std::listactivity_information[j].Type != ActivityDeliver && Task->activity_information[j].Type != ActivityGiveCash) { + if (Task->activity_information[j].activity_type != ActivityDeliver && + Task->activity_information[j].activity_type != ActivityGiveCash) { continue; } // Is there a zone restriction on the activity_information ? @@ -1989,29 +2041,29 @@ bool ClientTaskState::UpdateTasksOnDeliver(Client *client, std::listactivity_information[j].DeliverToNPC != npc_type_id) { + if (Task->activity_information[j].deliver_to_npc != npc_type_id) { continue; } // Is the activity_information related to these items ? // - if ((Task->activity_information[j].Type == ActivityGiveCash) && cash) { + if ((Task->activity_information[j].activity_type == ActivityGiveCash) && cash) { Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on GiveCash"); IncrementDoneCount(client, Task, i, j, cash); Ret = true; } else { for (auto &k : items) { - switch (Task->activity_information[j].GoalMethod) { + switch (Task->activity_information[j].goal_method) { case METHODSINGLEID: - if (Task->activity_information[j].GoalID != k->GetID()) { + if (Task->activity_information[j].goal_id != k->GetID()) { continue; } break; case METHODLIST: if (!p_task_manager->goal_list_manager.IsInList( - Task->activity_information[j].GoalID, + Task->activity_information[j].goal_id, k->GetID())) { continue; } @@ -2063,10 +2115,10 @@ void ClientTaskState::UpdateTasksOnTouch(Client *client, int zone_id) continue; } // We are only interested in touch activities - if (Task->activity_information[j].Type != ActivityTouch) { + if (Task->activity_information[j].activity_type != ActivityTouch) { continue; } - if (Task->activity_information[j].GoalMethod != METHODSINGLEID) { + if (Task->activity_information[j].goal_method != METHODSINGLEID) { continue; } if (!Task->activity_information[j].CheckZone(zone_id)) { @@ -2079,7 +2131,7 @@ void ClientTaskState::UpdateTasksOnTouch(Client *client, int zone_id) Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on Touch"); IncrementDoneCount( client, Task, cur_task->slot, j, - Task->activity_information[j].GoalCount - cur_task->activity[j].done_count + Task->activity_information[j].goal_count - cur_task->activity[j].done_count ); } } @@ -2102,8 +2154,8 @@ void ClientTaskState::IncrementDoneCount( info->activity[activity_id].done_count += count; - if (info->activity[activity_id].done_count > task_information->activity_information[activity_id].GoalCount) { - info->activity[activity_id].done_count = task_information->activity_information[activity_id].GoalCount; + if (info->activity[activity_id].done_count > task_information->activity_information[activity_id].goal_count) { + info->activity[activity_id].done_count = task_information->activity_information[activity_id].goal_count; } if (!ignore_quest_update) { @@ -2122,10 +2174,10 @@ void ClientTaskState::IncrementDoneCount( info->activity[activity_id].updated = true; // Have we reached the goal count for this activity_information ? - if (info->activity[activity_id].done_count >= task_information->activity_information[activity_id].GoalCount) { + if (info->activity[activity_id].done_count >= task_information->activity_information[activity_id].goal_count) { Log(Logs::General, Logs::Tasks, "[UPDATE] Done (%i) = Goal (%i) for activity_information %i", info->activity[activity_id].done_count, - task_information->activity_information[activity_id].GoalCount, + task_information->activity_information[activity_id].goal_count, activity_id); // Flag the activity_information as complete @@ -2140,7 +2192,7 @@ void ClientTaskState::IncrementDoneCount( // Inform the client the task has been updated, both by a chat message client->Message(Chat::White, "Your task '%s' has been updated.", task_information->title.c_str()); - if (task_information->activity_information[activity_id].GoalMethod != METHODQUEST) { + if (task_information->activity_information[activity_id].goal_method != METHODQUEST) { if (!ignore_quest_update) { char buf[24]; snprintf(buf, 23, "%d %d", info->task_id, info->activity[activity_id].activity_id); @@ -2205,7 +2257,7 @@ void ClientTaskState::IncrementDoneCount( // Send an updated packet for this single activity_information p_task_manager->SendTaskActivityLong( client, info->task_id, activity_id, task_index, - task_information->activity_information[activity_id].Optional + task_information->activity_information[activity_id].optional ); p_task_manager->SaveClientState(client, this); } @@ -2256,8 +2308,14 @@ void ClientTaskState::RewardTask(Client *client, TaskInformation *task_informati } // unsure if they use this packet or color, should work // just use normal NPC faction ID stuff - if (task_information->faction_reward) - client->SetFactionLevel(client->CharacterID(), task_information->faction_reward, client->GetBaseClass(), client->GetBaseRace(), client->GetDeity()); + if (task_information->faction_reward) { + client->SetFactionLevel( + client->CharacterID(), + task_information->faction_reward, + client->GetBaseClass(), + client->GetBaseRace(), + client->GetDeity()); + } if (task_information->cash_reward) { int Plat, Gold, Silver, Copper; @@ -2428,8 +2486,12 @@ bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) return false; } - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i). activity_state is %i ", task_id, - activity_id, info->activity[activity_id].activity_state); + Log(Logs::General, + Logs::Tasks, + "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i). activity_state is %i ", + task_id, + activity_id, + info->activity[activity_id].activity_state); return (info->activity[activity_id].activity_state == ActivityActive); } @@ -2554,19 +2616,35 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit } Log(Logs::General, Logs::Tasks, "[RESET] Increment done count on ResetTaskActivity"); - IncrementDoneCount(client, Task, ActiveTaskIndex, activity_id, (info->activity[activity_id].done_count * -1), false); + IncrementDoneCount( + client, + Task, + ActiveTaskIndex, + activity_id, + (info->activity[activity_id].done_count * -1), + false + ); } void ClientTaskState::ShowClientTasks(Client *client) { client->Message(Chat::White, "Task Information:"); if (active_task.task_id != TASKSLOTEMPTY) { - client->Message(Chat::White, "Task: %i %s", active_task.task_id, p_task_manager->p_task_data[active_task.task_id]->title.c_str()); - client->Message(Chat::White, " description: [%s]\n", p_task_manager->p_task_data[active_task.task_id]->description.c_str()); + client->Message( + Chat::White, + "Task: %i %s", + active_task.task_id, + p_task_manager->p_task_data[active_task.task_id]->title.c_str()); + client->Message( + Chat::White, + " description: [%s]\n", + p_task_manager->p_task_data[active_task.task_id]->description.c_str()); for (int j = 0; j < p_task_manager->GetActivityCount(active_task.task_id); j++) { client->Message( - Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - active_task.activity[j].activity_id, active_task.activity[j].done_count, + Chat::White, + " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", + active_task.activity[j].activity_id, + active_task.activity[j].done_count, active_task.activity[j].activity_state ); } @@ -2586,8 +2664,10 @@ void ClientTaskState::ShowClientTasks(Client *client) p_task_manager->p_task_data[active_quests[i].task_id]->description.c_str()); for (int j = 0; j < p_task_manager->GetActivityCount(active_quests[i].task_id); j++) { client->Message( - Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - active_quests[i].activity[j].activity_id, active_quests[i].activity[j].done_count, + Chat::White, + " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", + active_quests[i].activity[j].activity_id, + active_quests[i].activity[j].done_count, active_quests[i].activity[j].activity_state ); } @@ -2825,7 +2905,7 @@ void ClientTaskState::SendTaskHistory(Client *client, int task_index) Task->activity_information[i].target_name.size() + 1 + Task->activity_information[i].item_list.size() + 1 + sizeof(TaskHistoryReplyData2_Struct) + - Task->activity_information[i].desc_override.size() + 1; + Task->activity_information[i].description_override.size() + 1; } } @@ -2843,18 +2923,19 @@ void ClientTaskState::SendTaskHistory(Client *client, int task_index) for (int i = 0; i < Task->activity_count; i++) { if (completed_tasks[AdjustedTaskIndex].activity_done[i]) { thd1 = (TaskHistoryReplyData1_Struct *) Ptr; - thd1->ActivityType = Task->activity_information[i].Type; + thd1->ActivityType = Task->activity_information[i].activity_type; Ptr = (char *) thd1 + sizeof(TaskHistoryReplyData1_Struct); VARSTRUCT_ENCODE_STRING(Ptr, Task->activity_information[i].target_name.c_str()); VARSTRUCT_ENCODE_STRING(Ptr, Task->activity_information[i].item_list.c_str()); thd2 = (TaskHistoryReplyData2_Struct *) Ptr; - thd2->GoalCount = Task->activity_information[i].GoalCount; + thd2->GoalCount = Task->activity_information[i].goal_count; thd2->unknown04 = 0xffffffff; thd2->unknown08 = 0xffffffff; - thd2->ZoneID = Task->activity_information[i].ZoneIDs.empty() ? 0 : Task->activity_information[i].ZoneIDs.front(); + thd2->ZoneID = Task->activity_information[i].zone_ids.empty() ? 0 + : Task->activity_information[i].zone_ids.front(); thd2->unknown16 = 0x00000000; Ptr = (char *) thd2 + sizeof(TaskHistoryReplyData2_Struct); - VARSTRUCT_ENCODE_STRING(Ptr, Task->activity_information[i].desc_override.c_str()); + VARSTRUCT_ENCODE_STRING(Ptr, Task->activity_information[i].description_override.c_str()); } } @@ -2865,7 +2946,8 @@ void ClientTaskState::SendTaskHistory(Client *client, int task_index) } -void Client::SendTaskActivityComplete(int task_id, int activity_id, int task_index, TaskType task_type, int task_incomplete) +void +Client::SendTaskActivityComplete(int task_id, int activity_id, int task_index, TaskType task_type, int task_incomplete) { // 0x54eb @@ -3038,8 +3120,9 @@ void TaskManager::SendTaskActivityLong( // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes // no difference to the client. All activity_information updates will be done based on our interal activity_information types. - if ((p_task_data[task_id]->activity_information[activity_id].Type > 0) && p_task_data[task_id]->activity_information[activity_id].Type < 100) { - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].Type); + if ((p_task_data[task_id]->activity_information[activity_id].activity_type > 0) && + p_task_data[task_id]->activity_information[activity_id].activity_type < 100) { + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].activity_type); } else { buf.WriteUInt32(ActivityCastOn); @@ -3051,29 +3134,34 @@ void TaskManager::SendTaskActivityLong( buf.WriteString(p_task_data[task_id]->activity_information[activity_id].target_name); // target name string buf.WriteString(p_task_data[task_id]->activity_information[activity_id].item_list); // item name list - if (p_task_data[task_id]->activity_information[activity_id].Type != ActivityGiveCash) - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].GoalCount); - else + if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].goal_count); + } + else { // For our internal type GiveCash, where the goal count has the amount of cash that must be given, // we don't want the donecount and goalcount fields cluttered up with potentially large numbers, so we just // send a goalcount of 1, and a bit further down, a donecount of 1 if the activity_information is complete, 0 otherwise. // The text3 field should decribe the exact activity_information goal, e.g. give 3500gp to Hasten Bootstrutter. buf.WriteUInt32(1); + } buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].skill_id); buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].spell_id); buf.WriteUInt32( - p_task_data[task_id]->activity_information[activity_id].ZoneIDs.empty() ? 0 : p_task_data[task_id]->activity_information[activity_id].ZoneIDs.front()); + p_task_data[task_id]->activity_information[activity_id].zone_ids.empty() ? 0 + : p_task_data[task_id]->activity_information[activity_id].zone_ids.front()); buf.WriteUInt32(0); - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].desc_override); + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].description_override); - if (p_task_data[task_id]->activity_information[activity_id].Type != ActivityGiveCash) + if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { buf.WriteUInt32(client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id)); - else + } + else { // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= - p_task_data[task_id]->activity_information[activity_id].GoalCount)); + p_task_data[task_id]->activity_information[activity_id].goal_count)); + } buf.WriteUInt32(1); // unknown @@ -3104,8 +3192,9 @@ void TaskManager::SendTaskActivityNew( // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes // no difference to the client. All activity_information updates will be done based on our interal activity_information types. - if ((p_task_data[task_id]->activity_information[activity_id].Type > 0) && p_task_data[task_id]->activity_information[activity_id].Type < 100) { - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].Type); + if ((p_task_data[task_id]->activity_information[activity_id].activity_type > 0) && + p_task_data[task_id]->activity_information[activity_id].activity_type < 100) { + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].activity_type); } else { buf.WriteUInt32(ActivityCastOn); @@ -3120,10 +3209,12 @@ void TaskManager::SendTaskActivityNew( buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].item_list); // item name list // Goal Count - if (p_task_data[task_id]->activity_information[activity_id].Type != ActivityGiveCash) - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].GoalCount); - else - buf.WriteUInt32(1); // GoalCount + if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].goal_count); + } + else { + buf.WriteUInt32(1); + } // GoalCount // skill ID list ; separated buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].skill_list); @@ -3134,14 +3225,19 @@ void TaskManager::SendTaskActivityNew( buf.WriteString(p_task_data[task_id]->activity_information[activity_id].zones); buf.WriteUInt32(0); // unknown7 - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].desc_override); // description override + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].description_override); // description override - if (p_task_data[task_id]->activity_information[activity_id].Type != ActivityGiveCash) - buf.WriteUInt32(client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id)); // done_count + if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) + buf.WriteUInt32( + client->GetTaskActivityDoneCount( + p_task_data[task_id]->type, + client_task_index, + activity_id + )); // done_count else // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= - p_task_data[task_id]->activity_information[activity_id].GoalCount)); + p_task_data[task_id]->activity_information[activity_id].goal_count)); buf.WriteUInt8(1); // unknown9 @@ -3184,13 +3280,13 @@ void TaskManager::SendActiveTasksToClient(Client *client, bool task_complete) if (Activity == GetActivityCount(TaskID) - 1) { SendTaskActivityLong( client, TaskID, Activity, fixed_index, - p_task_data[TaskID]->activity_information[Activity].Optional, task_complete + p_task_data[TaskID]->activity_information[Activity].optional, task_complete ); } else { SendTaskActivityLong( client, TaskID, Activity, fixed_index, - p_task_data[TaskID]->activity_information[Activity].Optional, 0 + p_task_data[TaskID]->activity_information[Activity].optional, 0 ); } } @@ -3216,7 +3312,14 @@ void TaskManager::SendSingleActiveTaskToClient( } int StartTime = task_info.accepted_time; - SendActiveTaskDescription(client, TaskID, task_info, StartTime, p_task_data[TaskID]->duration, bring_up_task_journal); + SendActiveTaskDescription( + client, + TaskID, + task_info, + StartTime, + p_task_data[TaskID]->duration, + bring_up_task_journal + ); Log(Logs::General, Logs::Tasks, "[UPDATE] SendSingleActiveTasksToClient: Task %i, Activities: %i", @@ -3229,13 +3332,13 @@ void TaskManager::SendSingleActiveTaskToClient( if (Activity == GetActivityCount(TaskID) - 1) { SendTaskActivityLong( client, TaskID, Activity, task_info.slot, - p_task_data[TaskID]->activity_information[Activity].Optional, task_complete + p_task_data[TaskID]->activity_information[Activity].optional, task_complete ); } else { SendTaskActivityLong( client, TaskID, Activity, task_info.slot, - p_task_data[TaskID]->activity_information[Activity].Optional, 0 + p_task_data[TaskID]->activity_information[Activity].optional, 0 ); } } @@ -3655,7 +3758,11 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id } if (max_tasks) { - client->Message(Chat::Red, "You already have the maximum allowable number of active tasks (%i)", MAXACTIVEQUESTS); + client->Message( + Chat::Red, + "You already have the maximum allowable number of active tasks (%i)", + MAXACTIVEQUESTS + ); return; } @@ -3708,7 +3815,11 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id // This shouldn't happen unless there is a bug in the handling of ActiveTaskCount somewhere if (active_slot == nullptr) { - client->Message(Chat::Red, "You already have the maximum allowable number of active tasks (%i)", MAXACTIVEQUESTS); + client->Message( + Chat::Red, + "You already have the maximum allowable number of active tasks (%i)", + MAXACTIVEQUESTS + ); return; } @@ -3731,7 +3842,10 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id } p_task_manager->SendSingleActiveTaskToClient(client, *active_slot, false, true); - client->Message(Chat::White, "You have been assigned the task '%s'.", p_task_manager->p_task_data[task_id]->title.c_str()); + client->Message( + Chat::White, + "You have been assigned the task '%s'.", + p_task_manager->p_task_data[task_id]->title.c_str()); p_task_manager->SaveClientState(client, this); std::string buf = std::to_string(task_id); @@ -3767,7 +3881,7 @@ void ClientTaskState::ProcessTaskProximities(Client *client, float x, float y, f TaskGoalListManager::TaskGoalListManager() { - NumberOfLists = 0; + goal_lists_count = 0; } TaskGoalListManager::~TaskGoalListManager() {} @@ -3777,11 +3891,11 @@ bool TaskGoalListManager::LoadLists() Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskGoalListManager::LoadLists Called"); - TaskGoalLists.clear(); + task_goal_lists.clear(); const char *ERR_MYSQLERROR = "Error in TaskGoalListManager::LoadLists: %s %s"; - NumberOfLists = 0; + goal_lists_count = 0; std::string query = "SELECT `listid`, COUNT(`entry`) " "FROM `goallists` GROUP by `listid` " @@ -3791,39 +3905,39 @@ bool TaskGoalListManager::LoadLists() return false; } - NumberOfLists = results.RowCount(); - LogTasks("Loading GoalLists [{}] lists", NumberOfLists); + goal_lists_count = results.RowCount(); + LogTasks("Loading GoalLists [{}] lists", goal_lists_count); - TaskGoalLists.reserve(NumberOfLists); + task_goal_lists.reserve(goal_lists_count); int list_index = 0; for (auto row = results.begin(); row != results.end(); ++row) { int listID = atoi(row[0]); int listSize = atoi(row[1]); - TaskGoalLists.push_back({listID, 0, 0}); + task_goal_lists.push_back({listID, 0, 0}); - TaskGoalLists[list_index].GoalItemEntries.reserve(listSize); + task_goal_lists[list_index].GoalItemEntries.reserve(listSize); list_index++; } auto goal_lists = GoallistsRepository::GetWhere(content_db, "TRUE ORDER BY listid, entry ASC"); - for (list_index = 0; list_index < NumberOfLists; list_index++) { + for (list_index = 0; list_index < goal_lists_count; list_index++) { - int list_id = TaskGoalLists[list_index].ListID; + int list_id = task_goal_lists[list_index].ListID; for (auto &entry: goal_lists) { if (entry.listid == list_id) { - if (entry.entry < TaskGoalLists[list_index].Min) { - TaskGoalLists[list_index].Min = entry.entry; + if (entry.entry < task_goal_lists[list_index].Min) { + task_goal_lists[list_index].Min = entry.entry; } - if (entry.entry > TaskGoalLists[list_index].Max) { - TaskGoalLists[list_index].Max = entry.entry; + if (entry.entry > task_goal_lists[list_index].Max) { + task_goal_lists[list_index].Max = entry.entry; } - TaskGoalLists[list_index].GoalItemEntries.push_back(entry.entry); + task_goal_lists[list_index].GoalItemEntries.push_back(entry.entry); LogTasksDetail( "Goal list index [{}] loading list [{}] entry [{}]", @@ -3839,71 +3953,71 @@ bool TaskGoalListManager::LoadLists() } -int TaskGoalListManager::GetListByID(int ListID) +int TaskGoalListManager::GetListByID(int list_id) { // Find the list with the specified ListID and return the index auto it = std::find_if( - TaskGoalLists.begin(), - TaskGoalLists.end(), - [ListID](const TaskGoalList_Struct &t) { return t.ListID == ListID; } + task_goal_lists.begin(), + task_goal_lists.end(), + [list_id](const TaskGoalList_Struct &t) { return t.ListID == list_id; } ); - if (it == TaskGoalLists.end()) { + if (it == task_goal_lists.end()) { return -1; } - return std::distance(TaskGoalLists.begin(), it); + return std::distance(task_goal_lists.begin(), it); } -int TaskGoalListManager::GetFirstEntry(int ListID) +int TaskGoalListManager::GetFirstEntry(int list_id) { - int ListIndex = GetListByID(ListID); + int ListIndex = GetListByID(list_id); - if ((ListIndex < 0) || (ListIndex >= NumberOfLists)) { return -1; } + if ((ListIndex < 0) || (ListIndex >= goal_lists_count)) { return -1; } - if (TaskGoalLists[ListIndex].GoalItemEntries.empty()) { return -1; } + if (task_goal_lists[ListIndex].GoalItemEntries.empty()) { return -1; } - return TaskGoalLists[ListIndex].GoalItemEntries[0]; + return task_goal_lists[ListIndex].GoalItemEntries[0]; } -std::vector TaskGoalListManager::GetListContents(int ListID) +std::vector TaskGoalListManager::GetListContents(int list_index) { std::vector ListContents; - int ListIndex = GetListByID(ListID); + int ListIndex = GetListByID(list_index); - if ((ListIndex < 0) || (ListIndex >= NumberOfLists)) { return ListContents; } + if ((ListIndex < 0) || (ListIndex >= goal_lists_count)) { return ListContents; } - ListContents = TaskGoalLists[ListIndex].GoalItemEntries; + ListContents = task_goal_lists[ListIndex].GoalItemEntries; return ListContents; } -bool TaskGoalListManager::IsInList(int ListID, int Entry) +bool TaskGoalListManager::IsInList(int list_id, int entry) { - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i)", ListID, Entry); + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i)", list_id, entry); - int ListIndex = GetListByID(ListID); + int ListIndex = GetListByID(list_id); - if ((ListIndex < 0) || (ListIndex >= NumberOfLists)) { + if ((ListIndex < 0) || (ListIndex >= goal_lists_count)) { return false; } - if ((Entry < TaskGoalLists[ListIndex].Min) || (Entry > TaskGoalLists[ListIndex].Max)) { + if ((entry < task_goal_lists[ListIndex].Min) || (entry > task_goal_lists[ListIndex].Max)) { return false; } int FirstEntry = 0; - auto &task = TaskGoalLists[ListIndex]; + auto &task = task_goal_lists[ListIndex]; - auto it = std::find(task.GoalItemEntries.begin(), task.GoalItemEntries.end(), Entry); + auto it = std::find(task.GoalItemEntries.begin(), task.GoalItemEntries.end(), entry); if (it == task.GoalItemEntries.end()) { return false; } Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i) returning true", ListIndex, - Entry); + entry); return true; } @@ -3919,18 +4033,18 @@ TaskProximityManager::~TaskProximityManager() } -bool TaskProximityManager::LoadProximities(int zoneID) +bool TaskProximityManager::LoadProximities(int zone_id) { TaskProximity proximity; - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskProximityManager::LoadProximities Called for zone %i", zoneID); - TaskProximities.clear(); + Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskProximityManager::LoadProximities Called for zone %i", zone_id); + task_proximities.clear(); std::string query = StringFormat( "SELECT `exploreid`, `minx`, `maxx`, " "`miny`, `maxy`, `minz`, `maxz` " "FROM `proximities` WHERE `zoneid` = %i " - "ORDER BY `zoneid` ASC", zoneID + "ORDER BY `zoneid` ASC", zone_id ); auto results = content_db.QueryDatabase(query); if (!results.Success()) { @@ -3938,47 +4052,47 @@ bool TaskProximityManager::LoadProximities(int zoneID) } for (auto row = results.begin(); row != results.end(); ++row) { - proximity.ExploreID = atoi(row[0]); - proximity.MinX = atof(row[1]); - proximity.MaxX = atof(row[2]); - proximity.MinY = atof(row[3]); - proximity.MaxY = atof(row[4]); - proximity.MinZ = atof(row[5]); - proximity.MaxZ = atof(row[6]); + proximity.explore_id = atoi(row[0]); + proximity.min_x = atof(row[1]); + proximity.max_x = atof(row[2]); + proximity.min_y = atof(row[3]); + proximity.max_y = atof(row[4]); + proximity.min_z = atof(row[5]); + proximity.max_z = atof(row[6]); - TaskProximities.push_back(proximity); + task_proximities.push_back(proximity); } return true; } -int TaskProximityManager::CheckProximities(float X, float Y, float Z) +int TaskProximityManager::CheckProximities(float x, float y, float z) { - for (unsigned int i = 0; i < TaskProximities.size(); i++) { + for (unsigned int i = 0; i < task_proximities.size(); i++) { - TaskProximity *P = &TaskProximities[i]; + TaskProximity *P = &task_proximities[i]; Log(Logs::General, Logs::Tasks, "[PROXIMITY] Checking %8.3f, %8.3f, %8.3f against %8.3f, %8.3f, %8.3f, %8.3f, %8.3f, %8.3f", - X, - Y, - Z, - P->MinX, - P->MaxX, - P->MinY, - P->MaxY, - P->MinZ, - P->MaxZ); + x, + y, + z, + P->min_x, + P->max_x, + P->min_y, + P->max_y, + P->min_z, + P->max_z); - if (X < P->MinX || X > P->MaxX || Y < P->MinY || Y > P->MaxY || - Z < P->MinZ || Z > P->MaxZ) { + if (x < P->min_x || x > P->max_x || y < P->min_y || y > P->max_y || + z < P->min_z || z > P->max_z) { continue; } - return P->ExploreID; + return P->explore_id; } diff --git a/zone/tasks.h b/zone/tasks.h index 36ff62bc2..3a9213717 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -1,22 +1,3 @@ -/* EQEMu: Everquest Server Emulator -Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY except by those people which sell it, which - are required to give you total support for your newly bought product; - without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - #ifndef TASKS_H #define TASKS_H @@ -61,28 +42,31 @@ struct TaskGoalList_Struct { // This is used for handling lists, loading them from the database, searching them. // Used for lists of NPCs to kill, items to loot, etc, as well as lists of items to // reward the player with on completion of the task. -// class TaskGoalListManager { public: TaskGoalListManager(); ~TaskGoalListManager(); bool LoadLists(); - int GetListByID(int ListID); - bool IsInList(int ListID, int Entry); - int GetFirstEntry(int ListID); - std::vector GetListContents(int ListIndex); + int GetListByID(int list_id); + bool IsInList(int list_id, int entry); + int GetFirstEntry(int list_id); + std::vector GetListContents(int list_index); private: - - std::vector TaskGoalLists; - int NumberOfLists; + std::vector task_goal_lists; + int goal_lists_count; }; -typedef struct { - int ExploreID; - float MinX, MaxX, MinY, MaxY, MinZ, MaxZ; -} TaskProximity; +struct TaskProximity { + int explore_id; + float min_x; + float max_x; + float min_y; + float max_y; + float min_z; + float max_z; +}; // This class is used for managing proximities so that Quest NPC proximities don't need to be used. class TaskProximityManager { @@ -90,48 +74,49 @@ class TaskProximityManager { public: TaskProximityManager(); ~TaskProximityManager(); - bool LoadProximities(int ZoneID); - int CheckProximities(float X, float Y, float Z); + bool LoadProximities(int zone_id); + int CheckProximities(float x, float y, float z); private: - std::vector TaskProximities; + std::vector task_proximities; }; typedef enum { METHODSINGLEID = 0, - METHODLIST = 1, - METHODQUEST = 2 + METHODLIST = 1, + METHODQUEST = 2 } TaskMethodType; struct ActivityInformation { - int StepNumber; - int Type; + int step_number; + int activity_type; std::string target_name; // name mob, location -- default empty std::string item_list; // likely defaults to empty std::string skill_list; // IDs ; separated -- default -1 std::string spell_list; // IDs ; separated -- default 0 - std::string desc_override; // overrides auto generated description -- default empty + std::string description_override; // overrides auto generated description -- default empty int skill_id; // older clients, first id from above int spell_id; // older clients, first id from above - int GoalID; - TaskMethodType GoalMethod; - int GoalCount; - int DeliverToNPC; - std::vector ZoneIDs; + int goal_id; + TaskMethodType goal_method; + int goal_count; + int deliver_to_npc; + std::vector zone_ids; std::string zones; // IDs ; searated, ZoneID is the first in this list for older clients -- default empty string - bool Optional; + bool optional; inline bool CheckZone(int zone_id) { - if (ZoneIDs.empty()) { + if (zone_ids.empty()) { return true; } - return std::find(ZoneIDs.begin(), ZoneIDs.end(), zone_id) != ZoneIDs.end(); + return std::find(zone_ids.begin(), zone_ids.end(), zone_id) != zone_ids.end(); } }; typedef enum { - ActivitiesSequential = 0, ActivitiesStepped = 1 + ActivitiesSequential = 0, + ActivitiesStepped = 1 } SequenceType; enum class TaskType { From 11eab9c284225b4968c6f311c70c5b66b784ae9f Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 01:37:30 -0600 Subject: [PATCH 06/26] Move TaskManager::LoadTaskSets() loading to repositories --- zone/tasks.cpp | 49 ++++++++++++++++++++++--------------------------- zone/tasks.h | 2 +- 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 2a54c0113..ea918e043 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -41,51 +41,46 @@ Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net) #include "queryserv.h" #include "quest_parser_collection.h" #include "../common/repositories/completed_tasks_repository.h" +#include "../common/repositories/tasksets_repository.h" extern QueryServ *QServ; TaskManager::TaskManager() { - for (auto &Task : p_task_data) - Task = nullptr; + for (auto &task : p_task_data) { + task = nullptr; + } } TaskManager::~TaskManager() { - for (auto &Task : p_task_data) { - if (Task != nullptr) { - safe_delete(Task); + for (auto &task : p_task_data) { + if (task != nullptr) { + safe_delete(task); } } } bool TaskManager::LoadTaskSets() { - // Clear all task sets in memory. Done so we can reload them on the fly if required by just calling // this method again. - for (auto &TaskSet : task_sets) - TaskSet.clear(); - - std::string query = StringFormat( - "SELECT `id`, `taskid` from `tasksets` " - "WHERE `id` > 0 AND `id` < %i " - "AND `taskid` >= 0 AND `taskid` < %i " - "ORDER BY `id`, `taskid` ASC", - MAXTASKSETS, MAXTASKS - ); - auto results = content_db.QueryDatabase(query); - if (!results.Success()) { - LogError("Error in TaskManager::LoadTaskSets: [{}]", results.ErrorMessage().c_str()); - return false; + for (auto &task_set : task_sets) { + task_set.clear(); } - for (auto row = results.begin(); row != results.end(); ++row) { - int taskSet = atoi(row[0]); - int taskID = atoi(row[1]); + auto task_set_results = TasksetsRepository::GetWhere( + content_db, + fmt::format( + "`id` > 0 AND `id` < {} AND `taskid` >= 0 AND `taskid` < {} ORDER BY `id`, `taskid` ASC", + MAXTASKSETS, + MAXTASKS + ) + ); - task_sets[taskSet].push_back(taskID); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Adding task_id %4i to TaskSet %4i", taskID, taskSet); + for (auto &task_set: task_set_results) { + task_sets[task_set.id].push_back(task_set.taskid); + LogTasksDetail("[LoadTaskSets] Adding task_id [{}] to task_set [{}]", task_set.taskid, task_set.id); } return true; @@ -93,9 +88,9 @@ bool TaskManager::LoadTaskSets() void TaskManager::ReloadGoalLists() { - - if (!goal_list_manager.LoadLists()) + if (!goal_list_manager.LoadLists()) { Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadLists failed"); + } } bool TaskManager::LoadTasks(int single_task) diff --git a/zone/tasks.h b/zone/tasks.h index 3a9213717..d9a7c8375 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -365,7 +365,7 @@ public: private: TaskGoalListManager goal_list_manager; TaskProximityManager proximity_manager; - TaskInformation *p_task_data[MAXTASKS]; + TaskInformation *p_task_data[MAXTASKS]{}; std::vector task_sets[MAXTASKSETS]; void SendActiveTaskDescription( Client *client, From 32aeb6197f1ab610253df59421cc3161b500e002 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 02:33:07 -0600 Subject: [PATCH 07/26] Refactor and move TaskManager::LoadTasks to load from repositories --- zone/tasks.cpp | 362 ++++++++++++++++++++++++------------------------- 1 file changed, 175 insertions(+), 187 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index ea918e043..8ed1a73d8 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -42,6 +42,8 @@ Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net) #include "quest_parser_collection.h" #include "../common/repositories/completed_tasks_repository.h" #include "../common/repositories/tasksets_repository.h" +#include "../common/repositories/tasks_repository.h" +#include "../common/repositories/task_activities_repository.h" extern QueryServ *QServ; @@ -69,7 +71,7 @@ bool TaskManager::LoadTaskSets() task_set.clear(); } - auto task_set_results = TasksetsRepository::GetWhere( + auto rows = TasksetsRepository::GetWhere( content_db, fmt::format( "`id` > 0 AND `id` < {} AND `taskid` >= 0 AND `taskid` < {} ORDER BY `id`, `taskid` ASC", @@ -78,7 +80,7 @@ bool TaskManager::LoadTaskSets() ) ); - for (auto &task_set: task_set_results) { + for (auto &task_set: rows) { task_sets[task_set.id].push_back(task_set.taskid); LogTasksDetail("[LoadTaskSets] Adding task_id [{}] to task_set [{}]", task_set.taskid, task_set.id); } @@ -95,205 +97,193 @@ void TaskManager::ReloadGoalLists() bool TaskManager::LoadTasks(int single_task) { - // If task_id !=0, then just load the task specified. - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskManager::LoadTasks Called"); - + std::string task_query_filter = fmt::format("id = {}", single_task); std::string query; if (single_task == 0) { - if (!goal_list_manager.LoadLists()) - Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadLists failed"); + if (!goal_list_manager.LoadLists()) { + LogTasks("[TaskManager::LoadTasks] LoadLists failed"); + } - if (!LoadTaskSets()) - Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadTaskSets failed"); + if (!LoadTaskSets()) { + LogTasks("[TaskManager::LoadTasks] LoadTaskSets failed"); + } - query = StringFormat( - "SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " - "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," - "`minlevel`, `maxlevel`, `repeatable`, `completion_emote` FROM `tasks` WHERE `id` < %i", - MAXTASKS - ); - } - else { - query = StringFormat( - "SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " - "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," - "`minlevel`, `maxlevel`, `repeatable`, `completion_emote` FROM `tasks` WHERE `id` = %i", - single_task - ); + task_query_filter = fmt::format("id < {}", MAXTASKS); } - const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::LoadTasks: %s"; + // load task level data + auto repo_tasks = TasksRepository::GetWhere(content_db, task_query_filter); + for (auto &task: repo_tasks) { + int task_id = task.id; - auto results = content_db.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - return false; - } - - for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - - if ((taskID <= 0) || (taskID >= MAXTASKS)) { + if ((task_id <= 0) || (task_id >= MAXTASKS)) { // This shouldn't happen, as the SELECT is bounded by MAXTASKS - LogError("[TASKS]Task ID [{}] out of range while loading tasks from database", taskID); + LogError("[TASKS]Task ID [{}] out of range while loading tasks from database", task_id); continue; } - p_task_data[taskID] = new TaskInformation; - p_task_data[taskID]->type = static_cast(atoi(row[1])); - p_task_data[taskID]->duration = atoi(row[2]); - p_task_data[taskID]->duration_code = static_cast(atoi(row[3])); - p_task_data[taskID]->title = row[4]; - p_task_data[taskID]->description = row[5]; - p_task_data[taskID]->reward = row[6]; - p_task_data[taskID]->reward_id = atoi(row[7]); - p_task_data[taskID]->cash_reward = atoi(row[8]); - p_task_data[taskID]->experience_reward = atoi(row[9]); - p_task_data[taskID]->reward_method = (TaskMethodType) atoi(row[10]); - p_task_data[taskID]->faction_reward = atoi(row[11]); - p_task_data[taskID]->min_level = atoi(row[12]); - p_task_data[taskID]->max_level = atoi(row[13]); - p_task_data[taskID]->repeatable = atoi(row[14]); - p_task_data[taskID]->completion_emote = row[15]; - p_task_data[taskID]->activity_count = 0; - p_task_data[taskID]->sequence_mode = ActivitiesSequential; - p_task_data[taskID]->last_step = 0; + // load task data + p_task_data[task_id] = new TaskInformation; + p_task_data[task_id]->type = static_cast(task.type); + p_task_data[task_id]->duration = task.duration; + p_task_data[task_id]->duration_code = static_cast(task.duration_code); + p_task_data[task_id]->title = task.title; + p_task_data[task_id]->description = task.description; + p_task_data[task_id]->reward = task.reward; + p_task_data[task_id]->reward_id = task.rewardid; + p_task_data[task_id]->cash_reward = task.cashreward; + p_task_data[task_id]->experience_reward = task.xpreward; + p_task_data[task_id]->reward_method = (TaskMethodType) task.rewardmethod; + p_task_data[task_id]->faction_reward = task.faction_reward; + p_task_data[task_id]->min_level = task.minlevel; + p_task_data[task_id]->max_level = task.maxlevel; + p_task_data[task_id]->repeatable = task.repeatable; + p_task_data[task_id]->completion_emote = task.completion_emote; + p_task_data[task_id]->activity_count = 0; + p_task_data[task_id]->sequence_mode = ActivitiesSequential; + p_task_data[task_id]->last_step = 0; - Log(Logs::General, - Logs::Tasks, - "[GLOBALLOAD] task_id: %5i, duration: %8i, reward: %s min_level %i max_level %i " - "repeatable: %s", - taskID, - p_task_data[taskID]->duration, - p_task_data[taskID]->reward.c_str(), - p_task_data[taskID]->min_level, - p_task_data[taskID]->max_level, - p_task_data[taskID]->repeatable ? "Yes" : "No"); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] title: %s", p_task_data[taskID]->title.c_str()); + LogTasksDetail( + "[LoadTasks] (Task) task_id [{}] type [{}] duration [{}] duration_code [{}] title [{}] description [{}] " + " reward [{}] rewardid [{}] cashreward [{}] xpreward [{}] rewardmethod [{}] faction_reward [{}] minlevel [{}] " + " maxlevel [{}] repeatable [{}] completion_emote [{}] ", + task.id, + task.type, + task.duration, + task.duration_code, + task.title, + task.description, + task.reward, + task.rewardid, + task.cashreward, + task.xpreward, + task.rewardmethod, + task.faction_reward, + task.minlevel, + task.maxlevel, + task.repeatable, + task.completion_emote + ); } + LogTasks("Loaded [{}] Tasks", repo_tasks.size()); + + std::string activities_query_filter = fmt::format( + "taskid = {} and activityid < {} ORDER BY taskid, activityid ASC", + single_task, + MAXACTIVITIESPERTASK + ); + + // if loading only a single task if (single_task == 0) { - query = - StringFormat( - "SELECT `taskid`, `step`, `activityid`, `activitytype`, `target_name`, `item_list`, " - "`skill_list`, `spell_list`, `description_override`, `goalid`, `goalmethod`, " - "`goalcount`, `delivertonpc`, `zones`, `optional` FROM `task_activities` WHERE `taskid` < " - "%i AND `activityid` < %i ORDER BY taskid, activityid ASC", - MAXTASKS, MAXACTIVITIESPERTASK - ); - } - else { - query = - StringFormat( - "SELECT `taskid`, `step`, `activityid`, `activitytype`, `target_name`, `item_list`, " - "`skill_list`, `spell_list`, `description_override`, `goalid`, `goalmethod`, " - "`goalcount`, `delivertonpc`, `zones`, `optional` FROM `task_activities` WHERE `taskid` = " - "%i AND `activityid` < %i ORDER BY taskid, activityid ASC", - single_task, MAXACTIVITIESPERTASK - ); - } - results = content_db.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - return false; + activities_query_filter = fmt::format( + "taskid < {} and activityid < {} ORDER BY taskid, activityid ASC", + MAXTASKS, + MAXACTIVITIESPERTASK + ); } - for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - int step = atoi(row[1]); + // load activity data + auto task_activities = TaskActivitiesRepository::GetWhere(content_db, activities_query_filter); + for (auto &task_activity: task_activities) { + int task_id = task_activity.taskid; + int step = task_activity.step; + int activity_id = task_activity.activityid; - int activityID = atoi(row[2]); + // create pointer to activity data since declarations get unruly long + int activity_index = p_task_data[task_id]->activity_count; + ActivityInformation *p_activity_data = &p_task_data[task_id]->activity_information[activity_index]; + + if ((task_id <= 0) || (task_id >= MAXTASKS) || (activity_id < 0) || (activity_id >= MAXACTIVITIESPERTASK)) { - if ((taskID <= 0) || (taskID >= MAXTASKS) || (activityID < 0) || (activityID >= MAXACTIVITIESPERTASK)) { // This shouldn't happen, as the SELECT is bounded by MAXTASKS - LogError( - "[TASKS]Task or activity_information ID ([{}], [{}]) out of range while loading activities from database", - taskID, - activityID); + LogTasks( + "Error: Task or activity_information ID ([{}], [{}]) out of range while loading activities from database", + task_id, + activity_id + ); continue; } - if (p_task_data[taskID] == nullptr) { - LogError( - "[TASKS]activity_information for non-existent task ([{}], [{}]) while loading activities from database", - taskID, - activityID); + if (p_task_data[task_id] == nullptr) { + LogTasks( + "Error: activity_information for non-existent task ([{}], [{}]) while loading activities from database", + task_id, + activity_id + ); continue; } - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].step_number = step; + p_task_data[task_id]->activity_information[p_task_data[task_id]->activity_count].step_number = step; if (step != 0) { - p_task_data[taskID]->sequence_mode = ActivitiesStepped; + p_task_data[task_id]->sequence_mode = ActivitiesStepped; } - if (step > p_task_data[taskID]->last_step) { - p_task_data[taskID]->last_step = step; + if (step > p_task_data[task_id]->last_step) { + p_task_data[task_id]->last_step = step; } // Task Activities MUST be numbered sequentially from 0. If not, log an error // and set the task to nullptr. Subsequent activities for this task will raise // ERR_NOTASK errors. // Change to (activityID != (Tasks[taskID]->activity_count + 1)) to index from 1 - if (activityID != p_task_data[taskID]->activity_count) { - LogError("[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", taskID, - activityID); - p_task_data[taskID] = nullptr; + if (activity_id != p_task_data[task_id]->activity_count) { + LogError("[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", task_id, activity_id); + p_task_data[task_id] = nullptr; continue; } - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].activity_type = atoi(row[3]); + // set activity data + p_activity_data->activity_type = task_activity.activitytype; + p_activity_data->target_name = task_activity.target_name; + p_activity_data->item_list = task_activity.item_list; + p_activity_data->skill_list = task_activity.skill_list; + p_activity_data->skill_id = std::stoi(task_activity.skill_list); // for older clients + p_activity_data->spell_list = task_activity.spell_list; + p_activity_data->spell_id = std::stoi(task_activity.spell_list); // for older clients + p_activity_data->description_override = task_activity.description_override; + p_activity_data->goal_id = task_activity.goalid; + p_activity_data->goal_method = (TaskMethodType) task_activity.goalmethod; + p_activity_data->goal_count = task_activity.goalcount; + p_activity_data->deliver_to_npc = task_activity.delivertonpc; - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].target_name = row[4]; - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].item_list = row[5]; - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].skill_list = row[6]; - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].skill_id = atoi(row[6]); // for older clients - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_list = row[7]; - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_id = atoi(row[7]); // for older clients - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].description_override = row[8]; - - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_id = atoi(row[9]); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_method = (TaskMethodType) atoi( - row[10] - ); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_count = atoi(row[11]); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].deliver_to_npc = atoi(row[12]); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones = row[13]; - auto zones = SplitString( - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones, + // zones + p_activity_data->zones = task_activity.zones; + auto zones = SplitString( + task_activity.zones, ';' ); - for (auto &&e : zones) - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zone_ids.push_back( - std::stoi( - e - )); - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].optional = atoi(row[14]); - Log(Logs::General, Logs::Tasks, - "[GLOBALLOAD] activity_information Slot %2i: ID %i for Task %5i. Type: %3i, GoalID: %8i, " - "GoalMethod: %i, GoalCount: %3i, Zones:%s", - p_task_data[taskID]->activity_count, activityID, taskID, - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].activity_type, - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_id, - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_method, - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].goal_count, - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].zones.c_str()); + for (auto &&e : zones) { + p_activity_data->zone_ids.push_back(std::stoi(e)); + } - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] target_name: %s", - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].target_name.c_str()); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] item_list: %s", - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].item_list.c_str()); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] skill_list: %s", - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].skill_list.c_str()); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] spell_list: %s", - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].spell_list.c_str()); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] description_override: %s", - p_task_data[taskID]->activity_information[p_task_data[taskID]->activity_count].description_override.c_str()); + p_activity_data->optional = task_activity.optional; - p_task_data[taskID]->activity_count++; + LogTasksDetail( + "[LoadTasks] (Activity) task_id [{}] activity_id [{}] slot [{}] activity_type [{}] goal_id [{}] goal_method [{}] goal_count [{}] zones [{}]" + " target_name [{}] item_list [{}] skill_list [{}] spell_list [{}] description_override [{}]", + task_id, + activity_id, + p_task_data[task_id]->activity_count, + p_activity_data->activity_type, + p_activity_data->goal_id, + p_activity_data->goal_method, + p_activity_data->goal_count, + p_activity_data->zones.c_str(), + p_activity_data->target_name.c_str(), + p_activity_data->item_list.c_str(), + p_activity_data->skill_list.c_str(), + p_activity_data->spell_list.c_str(), + p_activity_data->description_override.c_str() + ); + + p_task_data[task_id]->activity_count++; } + LogTasks("Loaded [{}] Task Activities", task_activities.size()); + return true; } @@ -309,39 +299,38 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::SaveClientState %s"; - int characterID = client->CharacterID(); + int character_id = client->CharacterID(); - Log(Logs::Detail, Logs::Tasks, "TaskManager::SaveClientState for character ID %d", characterID); + Log(Logs::Detail, Logs::Tasks, "TaskManager::SaveClientState for character ID %d", character_id); if (client_task_state->active_task_count > 0 || client_task_state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks - for (auto &ActiveTask : client_task_state->ActiveTasks) { - int taskID = ActiveTask.task_id; - if (taskID == TASKSLOTEMPTY) { + for (auto &active_task : client_task_state->ActiveTasks) { + int task_id = active_task.task_id; + if (task_id == TASKSLOTEMPTY) { continue; } - int slot = ActiveTask.slot; - - if (ActiveTask.updated) { + int slot = active_task.slot; + if (active_task.updated) { Log(Logs::General, Logs::Tasks, "[CLIENTSAVE] TaskManager::SaveClientState for character ID %d, Updating TaskIndex " "%i task_id %i", - characterID, slot, taskID); + character_id, slot, task_id); std::string query = StringFormat( "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime) " "VALUES (%i, %i, %i, %i, %i)", - characterID, taskID, slot, static_cast(p_task_data[taskID]->type), - ActiveTask.accepted_time + character_id, task_id, slot, static_cast(p_task_data[task_id]->type), + active_task.accepted_time ); auto results = database.QueryDatabase(query); if (!results.Success()) { LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); } else { - ActiveTask.updated = false; + active_task.updated = false; } } @@ -350,32 +339,32 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s "VALUES "; int updatedActivityCount = 0; - for (int activityIndex = 0; activityIndex < p_task_data[taskID]->activity_count; ++activityIndex) { + for (int activityIndex = 0; activityIndex < p_task_data[task_id]->activity_count; ++activityIndex) { - if (!ActiveTask.activity[activityIndex].updated) { + if (!active_task.activity[activityIndex].updated) { continue; } Log(Logs::General, Logs::Tasks, "[CLIENTSAVE] TaskManager::SaveClientSate for character ID %d, Updating activity_information " "%i, %i", - characterID, slot, activityIndex); + character_id, slot, activityIndex); if (updatedActivityCount == 0) { query += StringFormat( - "(%i, %i, %i, %i, %i)", characterID, taskID, activityIndex, - ActiveTask.activity[activityIndex].done_count, - ActiveTask.activity[activityIndex].activity_state == + "(%i, %i, %i, %i, %i)", character_id, task_id, activityIndex, + active_task.activity[activityIndex].done_count, + active_task.activity[activityIndex].activity_state == ActivityCompleted ); } else { query += StringFormat( - ", (%i, %i, %i, %i, %i)", characterID, taskID, activityIndex, - ActiveTask.activity[activityIndex].done_count, - ActiveTask.activity[activityIndex].activity_state == + ", (%i, %i, %i, %i, %i)", character_id, task_id, activityIndex, + active_task.activity[activityIndex].done_count, + active_task.activity[activityIndex].activity_state == ActivityCompleted ); } @@ -395,11 +384,11 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s continue; } - ActiveTask.updated = false; - for (int activityIndex = 0; - activityIndex < p_task_data[taskID]->activity_count; + active_task.updated = false; + for (int activityIndex = 0; + activityIndex < p_task_data[task_id]->activity_count; ++activityIndex) - ActiveTask.activity[activityIndex].updated = false; + active_task.activity[activityIndex].updated = false; } } @@ -431,7 +420,7 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s std::string query = StringFormat( completedTaskQuery, - characterID, + character_id, client_task_state->completed_tasks[i].completed_time, taskID, -1 @@ -456,7 +445,7 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s } query = StringFormat( - completedTaskQuery, characterID, client_task_state->completed_tasks[i].completed_time, + completedTaskQuery, character_id, client_task_state->completed_tasks[i].completed_time, taskID, j ); results = database.QueryDatabase(query); @@ -3222,17 +3211,19 @@ void TaskManager::SendTaskActivityNew( buf.WriteString(p_task_data[task_id]->activity_information[activity_id].description_override); // description override - if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) + if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { buf.WriteUInt32( client->GetTaskActivityDoneCount( p_task_data[task_id]->type, client_task_index, activity_id )); // done_count - else + } + else { // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= p_task_data[task_id]->activity_information[activity_id].goal_count)); + } buf.WriteUInt8(1); // unknown9 @@ -3883,9 +3874,6 @@ TaskGoalListManager::~TaskGoalListManager() {} bool TaskGoalListManager::LoadLists() { - - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskGoalListManager::LoadLists Called"); - task_goal_lists.clear(); const char *ERR_MYSQLERROR = "Error in TaskGoalListManager::LoadLists: %s %s"; @@ -3901,7 +3889,7 @@ bool TaskGoalListManager::LoadLists() } goal_lists_count = results.RowCount(); - LogTasks("Loading GoalLists [{}] lists", goal_lists_count); + LogTasks("Loaded GoalLists [{}]", goal_lists_count); task_goal_lists.reserve(goal_lists_count); From 83b279bac31bc2df8d71c544a87552d20b7fa2f0 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 03:00:14 -0600 Subject: [PATCH 08/26] Migrate TaskManager::LoadClientState to repository methods --- zone/tasks.cpp | 106 ++++++++++++++++++++----------------------------- 1 file changed, 43 insertions(+), 63 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 8ed1a73d8..e0175c8f8 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -44,6 +44,8 @@ Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net) #include "../common/repositories/tasksets_repository.h" #include "../common/repositories/tasks_repository.h" #include "../common/repositories/task_activities_repository.h" +#include "../common/repositories/character_activities_repository.h" +#include "../common/repositories/character_tasks_repository.h" extern QueryServ *QServ; @@ -496,45 +498,36 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s LogTasks("[LoadClientState] for character_id [{}]", character_id); - std::string query = StringFormat( - "SELECT `taskid`, `slot`,`type`, `acceptedtime` " - "FROM `character_tasks` " - "WHERE `charid` = %i ORDER BY acceptedtime", - character_id + auto character_tasks = CharacterTasksRepository::GetWhere( + database, + fmt::format("charid = {} ORDER BY acceptedtime", character_id) ); - auto results = database.QueryDatabase(query); - if (!results.Success()) { - return false; - } - - for (auto row = results.begin(); row != results.end(); ++row) { - int task_id = atoi(row[0]); - int slot = atoi(row[1]); - auto type = static_cast(atoi(row[2])); + for (auto &character_task: character_tasks) { + int task_id = character_task.taskid; + int slot = character_task.slot; + auto type = static_cast(character_task.type); if ((task_id < 0) || (task_id >= MAXTASKS)) { - LogError("[TASKS]Task ID [{}] out of range while loading character tasks from database", task_id); + LogTasks("[LoadClientState] Error: task_id [{}] out of range while loading character tasks from database", task_id); continue; } auto task_info = client_task_state->GetClientTaskInfo(type, slot); if (task_info == nullptr) { - LogError("[TASKS] Slot [{}] out of range while loading character tasks from database", slot); + LogTasks("[LoadClientState] Error: slot [{}] out of range while loading character tasks from database", slot); continue; } if (task_info->task_id != TASKSLOTEMPTY) { - LogError("[TASKS] Slot [{}] for Task [{}]s is already occupied", slot, task_id); + LogTasks("[LoadClientState] Error: slot [{}] for task [{}] is already occupied", slot, task_id); continue; } - int accepted_time = atoi(row[3]); - task_info->task_id = task_id; task_info->current_step = -1; - task_info->accepted_time = accepted_time; + task_info->accepted_time = character_task.acceptedtime; task_info->updated = false; for (auto &i : task_info->activity) { @@ -545,29 +538,24 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s ++client_task_state->active_task_count; } - LogTasks("[LoadClientState] character_id [{}] task_id [{}] accepted_time [{}]", - character_id, - task_id, - accepted_time); + LogTasks( + "[LoadClientState] character_id [{}] task_id [{}] accepted_time [{}]", + character_id, + task_id, + character_task.acceptedtime + ); } // Load Activities LogTasks("[LoadClientState] Loading activities for character_id [{}]", character_id); - query = StringFormat( - "SELECT `taskid`, `activityid`, `donecount`, `completed` " - "FROM `character_activities` " - "WHERE `charid` = %i " - "ORDER BY `taskid` ASC, `activityid` ASC", - character_id + auto character_activities = CharacterActivitiesRepository::GetWhere( + database, + fmt::format("charid = {} ORDER BY `taskid` ASC, `activityid` ASC", character_id) ); - results = database.QueryDatabase(query); - if (!results.Success()) { - return false; - } - for (auto row = results.begin(); row != results.end(); ++row) { - int task_id = atoi(row[0]); + for (auto &character_activity: character_activities) { + int task_id = character_activity.taskid; if ((task_id < 0) || (task_id >= MAXTASKS)) { LogTasks( "[LoadClientState] Error: task_id [{}] out of range while loading character activities from database character_id [{}]", @@ -577,7 +565,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s continue; } - int activity_id = atoi(row[1]); + int activity_id = character_activity.activityid; if ((activity_id < 0) || (activity_id >= MAXACTIVITIESPERTASK)) { LogTasks( "[LoadClientState] Error: activity_id [{}] out of range while loading character activities from database character_id [{}]", @@ -613,11 +601,9 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s continue; } - int done_count = atoi(row[2]); - bool completed = atoi(row[3]); task_info->activity[activity_id].activity_id = activity_id; - task_info->activity[activity_id].done_count = done_count; - if (completed) { + task_info->activity[activity_id].done_count = character_activity.donecount; + if (character_activity.completed) { task_info->activity[activity_id].activity_state = ActivityCompleted; } else { @@ -631,33 +617,27 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s character_id, task_id, activity_id, - done_count, - completed + character_activity.donecount, + character_activity.completed ); } if (RuleB(TaskSystem, RecordCompletedTasks)) { - query = StringFormat( - "SELECT `taskid`, `activityid`, `completedtime` " - "FROM `completed_tasks` " - "WHERE `charid` = %i ORDER BY completedtime, taskid, activityid", - character_id - ); - results = database.QueryDatabase(query); - if (!results.Success()) { - return false; - } - CompletedTaskInformation completed_task_information{}; - for (bool &i : completed_task_information.activity_done) + for (bool &i : completed_task_information.activity_done) { i = false; + } int previous_task_id = -1; int previous_completed_time = -1; - for (auto row = results.begin(); row != results.end(); ++row) { + auto character_completed_tasks = CompletedTasksRepository::GetWhere( + database, + fmt::format("charid = {} ORDER BY completedtime, taskid, activityid", character_id) + ); - int task_id = atoi(row[0]); + for (auto &character_completed_task: character_completed_tasks) { + int task_id = character_completed_task.taskid; if ((task_id <= 0) || (task_id >= MAXTASKS)) { LogError("[TASKS]Task ID [{}] out of range while loading completed tasks from database", task_id); continue; @@ -667,14 +647,14 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s // task as complete. If the Rule to record optional activities is enabled, // subsequent records for this task will flag any optional tasks that were // completed. - int activity_id = atoi(row[1]); + int activity_id = character_completed_task.activityid; if ((activity_id < -1) || (activity_id >= MAXACTIVITIESPERTASK)) { LogError("[TASKS]activity_information ID [{}] out of range while loading completed tasks from database", activity_id); continue; } - int completed_time = atoi(row[2]); + int completed_time = character_completed_task.completedtime; if ((previous_task_id != -1) && ((task_id != previous_task_id) || (completed_time != previous_completed_time))) { client_task_state->completed_tasks.push_back(completed_task_information); @@ -711,13 +691,13 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); } - query = StringFormat( + std::string query = StringFormat( "SELECT `taskid` FROM character_enabledtasks " "WHERE `charid` = %i AND `taskid` >0 AND `taskid` < %i " "ORDER BY `taskid` ASC", character_id, MAXTASKS ); - results = database.QueryDatabase(query); + auto results = database.QueryDatabase(query); if (results.Success()) { for (auto row = results.begin(); row != results.end(); ++row) { int task_id = atoi(row[0]); @@ -778,7 +758,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s } } - LogTasks("[LoadClientState] for Character ID [{}}] DONE!", character_id); + LogTasks("[LoadClientState] for Character ID [{}] DONE!", character_id); return true; } @@ -3889,7 +3869,7 @@ bool TaskGoalListManager::LoadLists() } goal_lists_count = results.RowCount(); - LogTasks("Loaded GoalLists [{}]", goal_lists_count); + LogTasks("Loaded [{}] GoalLists", goal_lists_count); task_goal_lists.reserve(goal_lists_count); From 9816608bbaff322be00c994f70dd183731b63527 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 03:42:14 -0600 Subject: [PATCH 09/26] Another pass --- zone/tasks.cpp | 943 +++++++++++++++++++++++++------------------------ zone/tasks.h | 2 +- 2 files changed, 490 insertions(+), 455 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index e0175c8f8..26e4dbea8 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -114,7 +114,7 @@ bool TaskManager::LoadTasks(int single_task) } // load task level data - auto repo_tasks = TasksRepository::GetWhere(content_db, task_query_filter); + auto repo_tasks = TasksRepository::GetWhere(content_db, task_query_filter); for (auto &task: repo_tasks) { int task_id = task.id; @@ -186,7 +186,7 @@ bool TaskManager::LoadTasks(int single_task) } // load activity data - auto task_activities = TaskActivitiesRepository::GetWhere(content_db, activities_query_filter); + auto task_activities = TaskActivitiesRepository::GetWhere(content_db, activities_query_filter); for (auto &task_activity: task_activities) { int task_id = task_activity.taskid; int step = task_activity.step; @@ -231,7 +231,9 @@ bool TaskManager::LoadTasks(int single_task) // ERR_NOTASK errors. // Change to (activityID != (Tasks[taskID]->activity_count + 1)) to index from 1 if (activity_id != p_task_data[task_id]->activity_count) { - LogError("[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", task_id, activity_id); + LogError("[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", + task_id, + activity_id); p_task_data[task_id] = nullptr; continue; } @@ -307,7 +309,7 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s if (client_task_state->active_task_count > 0 || client_task_state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks - for (auto &active_task : client_task_state->ActiveTasks) { + for (auto &active_task : client_task_state->active_tasks) { int task_id = active_task.task_id; if (task_id == TASKSLOTEMPTY) { continue; @@ -509,14 +511,16 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s auto type = static_cast(character_task.type); if ((task_id < 0) || (task_id >= MAXTASKS)) { - LogTasks("[LoadClientState] Error: task_id [{}] out of range while loading character tasks from database", task_id); + LogTasks("[LoadClientState] Error: task_id [{}] out of range while loading character tasks from database", + task_id); continue; } auto task_info = client_task_state->GetClientTaskInfo(type, slot); if (task_info == nullptr) { - LogTasks("[LoadClientState] Error: slot [{}] out of range while loading character tasks from database", slot); + LogTasks("[LoadClientState] Error: slot [{}] out of range while loading character tasks from database", + slot); continue; } @@ -691,13 +695,13 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); } - std::string query = StringFormat( + std::string query = StringFormat( "SELECT `taskid` FROM character_enabledtasks " "WHERE `charid` = %i AND `taskid` >0 AND `taskid` < %i " "ORDER BY `taskid` ASC", character_id, MAXTASKS ); - auto results = database.QueryDatabase(query); + auto results = database.QueryDatabase(query); if (results.Success()) { for (auto row = results.begin(); row != results.end(); ++row) { int task_id = atoi(row[0]); @@ -710,7 +714,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s // This should only break if a ServerOP adds or deletes activites for a task that players already // have active, or due to a bug. for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - int task_id = client_task_state->ActiveTasks[i].task_id; + int task_id = client_task_state->active_tasks[i].task_id; if (task_id == TASKSLOTEMPTY) { continue; } @@ -723,11 +727,11 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s ); LogError("[LoadClientState] Character [{}] has task [{}] which does not exist", character_id, task_id); - client_task_state->ActiveTasks[i].task_id = TASKSLOTEMPTY; + client_task_state->active_tasks[i].task_id = TASKSLOTEMPTY; continue; } for (int activity_index = 0; activity_index < p_task_data[task_id]->activity_count; activity_index++) { - if (client_task_state->ActiveTasks[i].activity[activity_index].activity_id != activity_index) { + if (client_task_state->active_tasks[i].activity[activity_index].activity_id != activity_index) { client->Message( Chat::Red, "Active Task %i, %s. activity_information count does not match expected value." @@ -741,7 +745,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s activity_index, task_id ); - client_task_state->ActiveTasks[i].task_id = TASKSLOTEMPTY; + client_task_state->active_tasks[i].task_id = TASKSLOTEMPTY; break; } } @@ -945,18 +949,18 @@ int ClientTaskState::ActiveTasksInSet(int task_set_id) int ClientTaskState::CompletedTasksInSet(int task_set_id) { + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { + return -1; + } - - if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } - - int Count = 0; - - for (unsigned int i = 0; i < p_task_manager->task_sets[task_set_id].size(); i++) - if (IsTaskCompleted(p_task_manager->task_sets[task_set_id][i])) { - Count++; + int completed_tasks_count = 0; + for (int i : p_task_manager->task_sets[task_set_id]) { + if (IsTaskCompleted(i)) { + completed_tasks_count++; } + } - return Count; + return completed_tasks_count; } bool ClientTaskState::HasSlotForTask(TaskInformation *task) @@ -971,10 +975,11 @@ bool ClientTaskState::HasSlotForTask(TaskInformation *task) case TaskType::Shared: return false; // todo case TaskType::Quest: - for (int i = 0; i < MAXACTIVEQUESTS; ++i) - if (active_quests[i].task_id == TASKSLOTEMPTY) { + for (auto &active_quest : active_quests) { + if (active_quest.task_id == TASKSLOTEMPTY) { return true; } + } case TaskType::E: return false; // removed on live } @@ -984,18 +989,20 @@ bool ClientTaskState::HasSlotForTask(TaskInformation *task) int TaskManager::FirstTaskInSet(int task_set) { + if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { + return 0; + } - if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { return 0; } + if (task_sets[task_set].empty()) { + return 0; + } - if (task_sets[task_set].empty()) { return 0; } - - auto Iterator = task_sets[task_set].begin(); - - while (Iterator != task_sets[task_set].end()) { - if ((*Iterator) > 0) { - return (*Iterator); + auto iterator = task_sets[task_set].begin(); + while (iterator != task_sets[task_set].end()) { + if ((*iterator) > 0) { + return (*iterator); } - ++Iterator; + ++iterator; } return 0; @@ -1073,24 +1080,28 @@ TaskType TaskManager::GetTaskType(uint32 task_id) void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int task_set_id) { - int TaskList[MAXCHOOSERENTRIES]; - int TaskListIndex = 0; - int PlayerLevel = client->GetLevel(); + int task_list[MAXCHOOSERENTRIES]; + int task_list_index = 0; + int player_level = client->GetLevel(); - LogTasks("TaskSetSelector called for taskset [{}]. EnableTaskSize is [{}]", - task_set_id, - client_task_state->enabled_tasks.size()); + LogTasks( + "TaskSetSelector called for task_set_id [{}] EnableTaskSize is [{}]", + task_set_id, + client_task_state->enabled_tasks.size() + ); if (task_set_id <= 0 || task_set_id >= MAXTASKSETS) { return; } if (task_sets[task_set_id].empty()) { + // I think this is suppose to be yellow mob->SayString( client, Chat::Yellow, MAX_ACTIVE_TASKS, - client->GetName()); // I think this is suppose to be yellow + client->GetName() + ); return; } @@ -1098,32 +1109,31 @@ void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_s // A task_id of 0 in a TaskSet indicates that all Tasks in the set are enabled for all players. if (task_sets[task_set_id][0] == 0) { - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSets[%i][0] == 0. All Tasks in Set enabled.", task_set_id); + LogTasks("[TaskSetSelector] TaskSets[{}][0] == 0. All Tasks in Set enabled.", task_set_id); all_enabled = true; } - auto Iterator = task_sets[task_set_id].begin(); - + auto iterator = task_sets[task_set_id].begin(); if (all_enabled) { - ++Iterator; + ++iterator; } // skip first when all enabled since it's useless data - while (Iterator != task_sets[task_set_id].end() && TaskListIndex < MAXCHOOSERENTRIES) { - auto task = *Iterator; + while (iterator != task_sets[task_set_id].end() && task_list_index < MAXCHOOSERENTRIES) { + auto task = *iterator; // verify level, we're not currently on it, repeatable status, if it's a (shared) task // we aren't currently on another, and if it's enabled if not all_enabled - if ((all_enabled || client_task_state->IsTaskEnabled(task)) && ValidateLevel(task, PlayerLevel) && + if ((all_enabled || client_task_state->IsTaskEnabled(task)) && ValidateLevel(task, player_level) && !client_task_state->IsTaskActive(task) && client_task_state->HasSlotForTask(p_task_data[task]) && // this slot checking is a bit silly, but we allow mixing of task types ... (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { - TaskList[TaskListIndex++] = task; + task_list[task_list_index++] = task; } - ++Iterator; + ++iterator; } - if (TaskListIndex > 0) { - SendTaskSelector(client, mob, TaskListIndex, TaskList); + if (task_list_index > 0) { + SendTaskSelector(client, mob, task_list_index, task_list); } else { // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow @@ -1138,8 +1148,13 @@ void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_s // unlike the non-Quest version of this function, it does not check enabled, that is assumed the responsibility of the quest to handle // we do however still want it to check the other stuff like level, active, room, etc -void -TaskManager::TaskQuestSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int count, int *tasks) +void TaskManager::TaskQuestSetSelector( + Client *client, + ClientTaskState *client_task_state, + Mob *mob, + int count, + int *tasks +) { int task_list[MAXCHOOSERENTRIES]; int task_list_index = 0; @@ -1186,7 +1201,7 @@ void TaskManager::SendTaskSelector(Client *client, Mob *mob, int task_count, int } // Titanium OpCode: 0x5e7c LogTasks("TaskSelector for [{}] Tasks", task_count); - int PlayerLevel = client->GetLevel(); + int player_level = client->GetLevel(); // Check if any of the tasks exist for (int i = 0; i < task_count; i++) { @@ -1195,10 +1210,10 @@ void TaskManager::SendTaskSelector(Client *client, Mob *mob, int task_count, int } } - int ValidTasks = 0; + int valid_task_count = 0; for (int i = 0; i < task_count; i++) { - if (!ValidateLevel(task_list[i], PlayerLevel)) { + if (!ValidateLevel(task_list[i], player_level)) { continue; } if (client->IsTaskActive(task_list[i])) { @@ -1208,53 +1223,54 @@ void TaskManager::SendTaskSelector(Client *client, Mob *mob, int task_count, int continue; } - ValidTasks++; + valid_task_count++; } - if (ValidTasks == 0) { + if (valid_task_count == 0) { return; } - SerializeBuffer buf(50 * ValidTasks); + SerializeBuffer buf(50 * valid_task_count); - - buf.WriteUInt32(ValidTasks); + buf.WriteUInt32(valid_task_count); buf.WriteUInt32(2); // task type, live doesn't let you send more than one type, but we do? buf.WriteUInt32(mob->GetID()); - for (int i = 0; i < task_count; i++) { - if (!ValidateLevel(task_list[i], PlayerLevel)) { + for (int task_index = 0; task_index < task_count; task_index++) { + if (!ValidateLevel(task_list[task_index], player_level)) { continue; } - if (client->IsTaskActive(task_list[i])) { + if (client->IsTaskActive(task_list[task_index])) { continue; } - if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { + if (!IsTaskRepeatable(task_list[task_index]) && client->IsTaskCompleted(task_list[task_index])) { continue; } - buf.WriteUInt32(task_list[i]); // task_id + buf.WriteUInt32(task_list[task_index]); // task_id // affects color, difficulty? if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { buf.WriteFloat(1.0f); } - buf.WriteUInt32(p_task_data[task_list[i]]->duration); - buf.WriteUInt32(static_cast(p_task_data[task_list[i]]->duration_code)); + buf.WriteUInt32(p_task_data[task_list[task_index]]->duration); + buf.WriteUInt32(static_cast(p_task_data[task_list[task_index]]->duration_code)); - buf.WriteString(p_task_data[task_list[i]]->title); // max 64 with null - buf.WriteString(p_task_data[task_list[i]]->description); // max 4000 with null + buf.WriteString(p_task_data[task_list[task_index]]->title); // max 64 with null + buf.WriteString(p_task_data[task_list[task_index]]->description); // max 4000 with null // Has reward set flag if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { buf.WriteUInt8(0); } - buf.WriteUInt32(p_task_data[task_list[i]]->activity_count); + buf.WriteUInt32(p_task_data[task_list[task_index]]->activity_count); - for (int j = 0; j < p_task_data[task_list[i]]->activity_count; ++j) { - buf.WriteUInt32(j); // ActivityNumber - auto &activity = p_task_data[task_list[i]]->activity_information[j]; + for (int activity_index = 0; + activity_index < p_task_data[task_list[task_index]]->activity_count; + ++activity_index) { + buf.WriteUInt32(activity_index); // ActivityNumber + auto &activity = p_task_data[task_list[task_index]]->activity_information[activity_index]; buf.WriteUInt32(activity.activity_type); buf.WriteUInt32(0); // solo, group, raid? buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) @@ -1286,29 +1302,29 @@ void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, } } - int ValidTasks = 0; + int valid_tasks_count = 0; - for (int i = 0; i < task_count; i++) { - if (!ValidateLevel(task_list[i], PlayerLevel)) { + for (int task_index = 0; task_index < task_count; task_index++) { + if (!ValidateLevel(task_list[task_index], PlayerLevel)) { continue; } - if (client->IsTaskActive(task_list[i])) { + if (client->IsTaskActive(task_list[task_index])) { continue; } - if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { + if (!IsTaskRepeatable(task_list[task_index]) && client->IsTaskCompleted(task_list[task_index])) { continue; } - ValidTasks++; + valid_tasks_count++; } - if (ValidTasks == 0) { + if (valid_tasks_count == 0) { return; } - SerializeBuffer buf(50 * ValidTasks); + SerializeBuffer buf(50 * valid_tasks_count); - buf.WriteUInt32(ValidTasks); // TaskCount + buf.WriteUInt32(valid_tasks_count); // TaskCount buf.WriteUInt32(2); // Type, valid values: 0-3. 0 = Task, 1 = Shared Task, 2 = Quest, 3 = ??? -- should fix maybe some day, but we let more than 1 type through :P // so I guess an NPC can only offer one type of quests or we can only open a selection with one type :P (so quest call can tell us I guess) // this is also sent in OP_TaskDescription @@ -1370,15 +1386,11 @@ void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, int TaskManager::GetActivityCount(int task_id) { - - // Return the total number of activities in a particular task. - if ((task_id > 0) && (task_id < MAXTASKS)) { if (p_task_data[task_id]) { return p_task_data[task_id]->activity_count; } } return 0; - } void TaskManager::ExplainTask(Client *client, int task_id) @@ -1653,7 +1665,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np } // loop over the union of tasks and quests - for (auto &ActiveTask : ActiveTasks) { + for (auto &ActiveTask : active_tasks) { auto current_task = &ActiveTask; if (current_task->task_id == TASKSLOTEMPTY) { continue; @@ -1727,7 +1739,7 @@ int ClientTaskState::ActiveSpeakTask(int npc_type_id) } // loop over the union of tasks and quests - for (auto &active_task : ActiveTasks) { + for (auto &active_task : active_tasks) { auto current_task = &active_task; if (current_task->task_id == TASKSLOTEMPTY) { continue; @@ -1757,6 +1769,7 @@ int ClientTaskState::ActiveSpeakTask(int npc_type_id) } } } + return 0; } @@ -1773,8 +1786,8 @@ int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) } // loop over the union of tasks and quests - for (auto &ActiveTask : ActiveTasks) { - auto current_task = &ActiveTask; + for (auto &active_task : active_tasks) { + auto current_task = &active_task; if (current_task->task_id != task_id) { continue; } @@ -1824,15 +1837,15 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t } // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->task_id == TASKSLOTEMPTY) { + for (auto &active_task : active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { continue; } // Check if there are any active loot activities for this task - TaskInformation *Task = p_task_manager->p_task_data[cur_task->task_id]; + TaskInformation *Task = p_task_manager->p_task_data[current_task->task_id]; if (Task == nullptr) { return; @@ -1840,7 +1853,7 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t for (int j = 0; j < Task->activity_count; j++) { // We are not interested in completed or hidden activities - if (cur_task->activity[j].activity_state != ActivityActive) { + if (current_task->activity[j].activity_state != ActivityActive) { continue; } // We are only interested in the ActivityType we were called with @@ -1878,65 +1891,64 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t } // We found an active task related to this item, so increment the done count Log(Logs::General, Logs::Tasks, "[UPDATE] Calling increment done count ForItem"); - IncrementDoneCount(client, Task, cur_task->slot, j, count); + IncrementDoneCount(client, Task, current_task->slot, j, count); } } - - return; } void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) { - - // If the client has no tasks, there is nothing further to check. - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksOnExplore(%i)", explore_id); + LogTasks("[UpdateTasksOnExplore] explore_id [{}]", explore_id); if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; } // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->task_id == TASKSLOTEMPTY) { + for (auto &active_task : active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { continue; } // Check if there are any active explore activities for this task - TaskInformation *Task = p_task_manager->p_task_data[cur_task->task_id]; - - if (Task == nullptr) { + TaskInformation *task_data = p_task_manager->p_task_data[current_task->task_id]; + if (task_data == nullptr) { return; } - for (int j = 0; j < Task->activity_count; j++) { + for (int activity_id = 0; activity_id < task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &task_data->activity_information[activity_id]; + // We are not interested in completed or hidden activities - if (cur_task->activity[j].activity_state != ActivityActive) { + if (client_activity->activity_state != ActivityActive) { continue; } // We are only interested in explore activities - if (Task->activity_information[j].activity_type != ActivityExplore) { + if (activity_info->activity_type != ActivityExplore) { continue; } - if (!Task->activity_information[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] Char: %s Explore exploreid %i failed zone check", client->GetName(), - explore_id); + if (!activity_info->CheckZone(zone->GetZoneID())) { + LogTasks( + "[UpdateTasksOnExplore] character [{}] explore_id [{}] failed zone check", + client->GetName(), + explore_id + ); continue; } // Is the activity_information to explore this area id ? - switch (Task->activity_information[j].goal_method) { + switch (activity_info->goal_method) { case METHODSINGLEID: - if (Task->activity_information[j].goal_id != explore_id) { + if (activity_info->goal_id != explore_id) { continue; } break; case METHODLIST: if (!p_task_manager->goal_list_manager.IsInList( - Task->activity_information[j].goal_id, + activity_info->goal_id, explore_id )) { continue; @@ -1947,88 +1959,95 @@ void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) // If METHODQUEST, don't updated the activity_information here continue; } + // We found an active task to explore this area, so set done count to goal count // (Only a goal count of 1 makes sense for explore activities?) - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on explore"); + LogTasks( + "[UpdateTasksOnExplore] character [{}] explore_id [{}] increment on explore", + client->GetName(), + explore_id + ); + IncrementDoneCount( - client, Task, cur_task->slot, j, - Task->activity_information[j].goal_count - cur_task->activity[j].done_count + client, + task_data, + current_task->slot, + activity_id, + activity_info->goal_count - current_task->activity[activity_id].done_count ); } } - - return; } bool ClientTaskState::UpdateTasksOnDeliver(Client *client, std::list &items, int cash, int npc_type_id) { - bool Ret = false; - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksForOnDeliver(%d)", npc_type_id); + bool is_updated = false; + LogTasks("[UpdateTasksOnDeliver] [{}]", npc_type_id); if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return false; } // loop over the union of tasks and quests for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->task_id == TASKSLOTEMPTY) { + auto current_task = &active_tasks[i]; + if (current_task->task_id == TASKSLOTEMPTY) { continue; } // Check if there are any active deliver activities for this task - - TaskInformation *Task = p_task_manager->p_task_data[cur_task->task_id]; - - if (Task == nullptr) { + TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { return false; } - for (int j = 0; j < Task->activity_count; j++) { + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + // We are not interested in completed or hidden activities - if (cur_task->activity[j].activity_state != ActivityActive) { + if (client_activity->activity_state != ActivityActive) { continue; } + // We are only interested in Deliver activities - if (Task->activity_information[j].activity_type != ActivityDeliver && - Task->activity_information[j].activity_type != ActivityGiveCash) { + if (activity_info->activity_type != ActivityDeliver && + activity_info->activity_type != ActivityGiveCash) { continue; } // Is there a zone restriction on the activity_information ? - if (!Task->activity_information[j].CheckZone(zone->GetZoneID())) { + if (!activity_info->CheckZone(zone->GetZoneID())) { Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Deliver activity_information failed zone check (current zone %i, need zone " "%s", - client->GetName(), zone->GetZoneID(), Task->activity_information[j].zones.c_str()); + client->GetName(), zone->GetZoneID(), activity_info->zones.c_str()); continue; } // Is the activity_information to deliver to this NPCTypeID ? - if (Task->activity_information[j].deliver_to_npc != npc_type_id) { + if (activity_info->deliver_to_npc != npc_type_id) { continue; } // Is the activity_information related to these items ? // - if ((Task->activity_information[j].activity_type == ActivityGiveCash) && cash) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on GiveCash"); - IncrementDoneCount(client, Task, i, j, cash); - Ret = true; + if ((activity_info->activity_type == ActivityGiveCash) && cash) { + LogTasks("[UpdateTasksOnDeliver] Increment on GiveCash"); + IncrementDoneCount(client, p_task_data, i, activity_id, cash); + is_updated = true; } else { - for (auto &k : items) { - switch (Task->activity_information[j].goal_method) { - + for (auto &item : items) { + switch (activity_info->goal_method) { case METHODSINGLEID: - if (Task->activity_information[j].goal_id != k->GetID()) { + if (activity_info->goal_id != item->GetID()) { continue; } break; case METHODLIST: if (!p_task_manager->goal_list_manager.IsInList( - Task->activity_information[j].goal_id, - k->GetID())) { + activity_info->goal_id, + item->GetID())) { continue; } break; @@ -2038,73 +2057,88 @@ ClientTaskState::UpdateTasksOnDeliver(Client *client, std::listslot, j, k->GetCharges() <= 0 ? 1 : k->GetCharges()); - Ret = true; + LogTasks("[UpdateTasksOnDeliver] Increment on GiveItem"); + IncrementDoneCount( + client, + p_task_data, + current_task->slot, + activity_id, + item->GetCharges() <= 0 ? 1 : item->GetCharges() + ); + is_updated = true; } } } } - return Ret; + return is_updated; } void ClientTaskState::UpdateTasksOnTouch(Client *client, int zone_id) { // If the client has no tasks, there is nothing further to check. - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksOnTouch(%i)", zone_id); + LogTasks("[UpdateTasksOnTouch] [{}] ", zone_id); if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; } // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->task_id == TASKSLOTEMPTY) { + for (auto &active_task : active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { continue; } // Check if there are any active explore activities for this task - - TaskInformation *Task = p_task_manager->p_task_data[cur_task->task_id]; - - if (Task == nullptr) { + TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { return; } - for (int j = 0; j < Task->activity_count; j++) { + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + // We are not interested in completed or hidden activities - if (cur_task->activity[j].activity_state != ActivityActive) { + if (current_task->activity[activity_id].activity_state != ActivityActive) { continue; } // We are only interested in touch activities - if (Task->activity_information[j].activity_type != ActivityTouch) { + if (activity_info->activity_type != ActivityTouch) { continue; } - if (Task->activity_information[j].goal_method != METHODSINGLEID) { + if (activity_info->goal_method != METHODSINGLEID) { continue; } - if (!Task->activity_information[j].CheckZone(zone_id)) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Touch activity_information failed zone check", - client->GetName()); + if (!activity_info->CheckZone(zone_id)) { + LogTasks( + "[UpdateTasksOnTouch] character [{}] Touch activity_information failed zone check", + client->GetName() + ); continue; } + // We found an active task to zone into this zone, so set done count to goal count // (Only a goal count of 1 makes sense for touch activities?) - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on Touch"); + LogTasks("[UpdateTasksOnTouch] Increment on Touch"); IncrementDoneCount( - client, Task, cur_task->slot, j, - Task->activity_information[j].goal_count - cur_task->activity[j].done_count + client, + p_task_data, + current_task->slot, + activity_id, + activity_info->goal_count - current_task->activity[activity_id].done_count ); } } - - return; } void ClientTaskState::IncrementDoneCount( - Client *client, TaskInformation *task_information, int task_index, int activity_id, int count, + Client *client, + TaskInformation *task_information, + int task_index, + int activity_id, + int count, bool ignore_quest_update ) { @@ -2230,13 +2264,14 @@ void ClientTaskState::IncrementDoneCount( void ClientTaskState::RewardTask(Client *client, TaskInformation *task_information) { - if (!task_information || !client) { return; } + if (!task_information || !client) { + return; + } const EQ::ItemData *Item; std::vector RewardList; switch (task_information->reward_method) { - case METHODSINGLEID: { if (task_information->reward_id) { client->SummonItem(task_information->reward_id); @@ -2249,9 +2284,9 @@ void ClientTaskState::RewardTask(Client *client, TaskInformation *task_informati } case METHODLIST: { RewardList = p_task_manager->goal_list_manager.GetListContents(task_information->reward_id); - for (unsigned int i = 0; i < RewardList.size(); i++) { - client->SummonItem(RewardList[i]); - Item = database.GetItem(RewardList[i]); + for (int i : RewardList) { + client->SummonItem(i); + Item = database.GetItem(i); if (Item) { client->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); } @@ -2278,73 +2313,74 @@ void ClientTaskState::RewardTask(Client *client, TaskInformation *task_informati task_information->faction_reward, client->GetBaseClass(), client->GetBaseRace(), - client->GetDeity()); + client->GetDeity() + ); } if (task_information->cash_reward) { - int Plat, Gold, Silver, Copper; + int platinum, gold, silver, copper; - Copper = task_information->cash_reward; - client->AddMoneyToPP(Copper, true); + copper = task_information->cash_reward; + client->AddMoneyToPP(copper, true); - Plat = Copper / 1000; - Copper = Copper - (Plat * 1000); - Gold = Copper / 100; - Copper = Copper - (Gold * 100); - Silver = Copper / 10; - Copper = Copper - (Silver * 10); + platinum = copper / 1000; + copper = copper - (platinum * 1000); + gold = copper / 100; + copper = copper - (gold * 100); + silver = copper / 10; + copper = copper - (silver * 10); - std::string CashMessage; + std::string cash_message; - if (Plat > 0) { - CashMessage = "You receive "; - CashMessage += itoa(Plat); - CashMessage += " platinum"; + if (platinum > 0) { + cash_message = "You receive "; + cash_message += itoa(platinum); + cash_message += " platinum"; } - if (Gold > 0) { - if (CashMessage.length() == 0) { - CashMessage = "You receive "; + if (gold > 0) { + if (cash_message.length() == 0) { + cash_message = "You receive "; } else { - CashMessage += ","; + cash_message += ","; } - CashMessage += itoa(Gold); - CashMessage += " gold"; + cash_message += itoa(gold); + cash_message += " gold"; } - if (Silver > 0) { - if (CashMessage.length() == 0) { - CashMessage = "You receive "; + if (silver > 0) { + if (cash_message.length() == 0) { + cash_message = "You receive "; } else { - CashMessage += ","; + cash_message += ","; } - CashMessage += itoa(Silver); - CashMessage += " silver"; + cash_message += itoa(silver); + cash_message += " silver"; } - if (Copper > 0) { - if (CashMessage.length() == 0) { - CashMessage = "You receive "; + if (copper > 0) { + if (cash_message.length() == 0) { + cash_message = "You receive "; } else { - CashMessage += ","; + cash_message += ","; } - CashMessage += itoa(Copper); - CashMessage += " copper"; + cash_message += itoa(copper); + cash_message += " copper"; } - CashMessage += " pieces."; - client->Message(Chat::Yellow, CashMessage.c_str()); + cash_message += " pieces."; + client->Message(Chat::Yellow, cash_message.c_str()); } - int32 EXPReward = task_information->experience_reward; - if (EXPReward > 0) { - client->AddEXP(EXPReward); + int32 experience_reward = task_information->experience_reward; + if (experience_reward > 0) { + client->AddEXP(experience_reward); } - if (EXPReward < 0) { - uint32 PosReward = EXPReward * -1; + if (experience_reward < 0) { + uint32 pos_reward = experience_reward * -1; // Minimal Level Based Exp reward Setting is 101 (1% exp at level 1) - if (PosReward > 100 && PosReward < 25700) { - uint8 MaxLevel = PosReward / 100; - uint8 ExpPercent = PosReward - (MaxLevel * 100); - client->AddLevelBasedExp(ExpPercent, MaxLevel); + if (pos_reward > 100 && pos_reward < 25700) { + uint8 max_level = pos_reward / 100; + uint8 exp_percent = pos_reward - (max_level * 100); + client->AddLevelBasedExp(exp_percent, max_level); } } @@ -2361,8 +2397,8 @@ bool ClientTaskState::IsTaskActive(int task_id) return false; } - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { + for (auto &active_quest : active_quests) { + if (active_quest.task_id == task_id) { return true; } } @@ -2410,43 +2446,43 @@ bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) return false; } - int ActiveTaskIndex = -1; - auto type = TaskType::Task; + int active_task_index = -1; + auto task_type = TaskType::Task; if (active_task.task_id == task_id) { - ActiveTaskIndex = 0; + active_task_index = 0; } - if (ActiveTaskIndex == -1) { + if (active_task_index == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { if (active_quests[i].task_id == task_id) { - ActiveTaskIndex = i; - type = TaskType::Quest; + active_task_index = i; + task_type = TaskType::Quest; break; } } } // The client does not have this task - if (ActiveTaskIndex == -1) { + if (active_task_index == -1) { return false; } - auto info = GetClientTaskInfo(type, ActiveTaskIndex); + auto info = GetClientTaskInfo(task_type, active_task_index); if (info == nullptr) { return false; } - TaskInformation *Task = p_task_manager->p_task_data[info->task_id]; + TaskInformation *p_task_data = p_task_manager->p_task_data[info->task_id]; // The task is invalid - if (Task == nullptr) { + if (p_task_data == nullptr) { return false; } // The activity_id is out of range - if (activity_id >= Task->activity_count) { + if (activity_id >= p_task_data->activity_count) { return false; } @@ -2476,29 +2512,29 @@ void ClientTaskState::UpdateTaskActivity( return; } - int ActiveTaskIndex = -1; - auto type = TaskType::Task; + int active_task_index = -1; + auto type = TaskType::Task; if (active_task.task_id == task_id) { - ActiveTaskIndex = 0; + active_task_index = 0; } - if (ActiveTaskIndex == -1) { + if (active_task_index == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { if (active_quests[i].task_id == task_id) { - ActiveTaskIndex = i; - type = TaskType::Quest; + active_task_index = i; + type = TaskType::Quest; break; } } } // The client does not have this task - if (ActiveTaskIndex == -1) { + if (active_task_index == -1) { return; } - auto info = GetClientTaskInfo(type, ActiveTaskIndex); + auto info = GetClientTaskInfo(type, active_task_index); if (info == nullptr) { return; @@ -2522,7 +2558,7 @@ void ClientTaskState::UpdateTaskActivity( } Log(Logs::General, Logs::Tasks, "[UPDATE] Increment done count on UpdateTaskActivity %d %d", activity_id, count); - IncrementDoneCount(client, Task, ActiveTaskIndex, activity_id, count, ignore_quest_update); + IncrementDoneCount(client, Task, active_task_index, activity_id, count, ignore_quest_update); } void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activity_id) @@ -2534,43 +2570,41 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit return; } - int ActiveTaskIndex = -1; - auto type = TaskType::Task; + int active_task_index = -1; + auto type = TaskType::Task; if (active_task.task_id == task_id) { - ActiveTaskIndex = 0; + active_task_index = 0; } - if (ActiveTaskIndex == -1) { + if (active_task_index == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { if (active_quests[i].task_id == task_id) { - ActiveTaskIndex = i; - type = TaskType::Quest; + active_task_index = i; + type = TaskType::Quest; break; } } } // The client does not have this task - if (ActiveTaskIndex == -1) { + if (active_task_index == -1) { return; } - auto info = GetClientTaskInfo(type, ActiveTaskIndex); + auto info = GetClientTaskInfo(type, active_task_index); if (info == nullptr) { return; } - TaskInformation *Task = p_task_manager->p_task_data[info->task_id]; - - // The task is invalid - if (Task == nullptr) { + TaskInformation *p_task_data = p_task_manager->p_task_data[info->task_id]; + if (p_task_data == nullptr) { return; } // The activity_id is out of range - if (activity_id >= Task->activity_count) { + if (activity_id >= p_task_data->activity_count) { return; } @@ -2582,8 +2616,8 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit Log(Logs::General, Logs::Tasks, "[RESET] Increment done count on ResetTaskActivity"); IncrementDoneCount( client, - Task, - ActiveTaskIndex, + p_task_data, + active_task_index, activity_id, (info->activity[activity_id].done_count * -1), false @@ -2598,41 +2632,47 @@ void ClientTaskState::ShowClientTasks(Client *client) Chat::White, "Task: %i %s", active_task.task_id, - p_task_manager->p_task_data[active_task.task_id]->title.c_str()); + p_task_manager->p_task_data[active_task.task_id]->title.c_str() + ); client->Message( Chat::White, " description: [%s]\n", - p_task_manager->p_task_data[active_task.task_id]->description.c_str()); - for (int j = 0; j < p_task_manager->GetActivityCount(active_task.task_id); j++) { + p_task_manager->p_task_data[active_task.task_id]->description.c_str() + ); + for (int activity_id = 0; activity_id < p_task_manager->GetActivityCount(active_task.task_id); activity_id++) { client->Message( Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - active_task.activity[j].activity_id, - active_task.activity[j].done_count, - active_task.activity[j].activity_state + active_task.activity[activity_id].activity_id, + active_task.activity[activity_id].done_count, + active_task.activity[activity_id].activity_state ); } } - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == TASKSLOTEMPTY) { + for (auto &active_quest : active_quests) { + if (active_quest.task_id == TASKSLOTEMPTY) { continue; } client->Message( - Chat::White, "Quest: %i %s", active_quests[i].task_id, - p_task_manager->p_task_data[active_quests[i].task_id]->title.c_str()); + Chat::White, "Quest: %i %s", active_quest.task_id, + p_task_manager->p_task_data[active_quest.task_id]->title.c_str() + ); + client->Message( Chat::White, " description: [%s]\n", - p_task_manager->p_task_data[active_quests[i].task_id]->description.c_str()); - for (int j = 0; j < p_task_manager->GetActivityCount(active_quests[i].task_id); j++) { + p_task_manager->p_task_data[active_quest.task_id]->description.c_str() + ); + + for (int j = 0; j < p_task_manager->GetActivityCount(active_quest.task_id); j++) { client->Message( Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - active_quests[i].activity[j].activity_id, - active_quests[i].activity[j].done_count, - active_quests[i].activity[j].activity_state + active_quest.activity[j].activity_id, + active_quest.activity[j].done_count, + active_quest.activity[j].activity_state ); } } @@ -2642,50 +2682,47 @@ void ClientTaskState::ShowClientTasks(Client *client) int ClientTaskState::TaskTimeLeft(int task_id) { if (active_task.task_id == task_id) { - int Now = time(nullptr); + int time_now = time(nullptr); - TaskInformation *Task = p_task_manager->p_task_data[task_id]; - - if (Task == nullptr) { + TaskInformation *p_task_data = p_task_manager->p_task_data[task_id]; + if (p_task_data == nullptr) { return -1; } - if (!Task->duration) { + if (!p_task_data->duration) { return -1; } - int TimeLeft = (active_task.accepted_time + Task->duration - Now); + int time_left = (active_task.accepted_time + p_task_data->duration - time_now); - return (TimeLeft > 0 ? TimeLeft : 0); + return (time_left > 0 ? time_left : 0); } if (active_task_count == 0) { return -1; } - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - - if (active_quests[i].task_id != task_id) { + for (auto &active_quest : active_quests) { + if (active_quest.task_id != task_id) { continue; } - int Now = time(nullptr); + int time_now = time(nullptr); - TaskInformation *Task = p_task_manager->p_task_data[active_quests[i].task_id]; - - if (Task == nullptr) { + TaskInformation *p_task_data = p_task_manager->p_task_data[active_quest.task_id]; + if (p_task_data == nullptr) { return -1; } - if (!Task->duration) { + if (!p_task_data->duration) { return -1; } - int TimeLeft = (active_quests[i].accepted_time + Task->duration - Now); + int time_left = (active_quest.accepted_time + p_task_data->duration - time_now); // If Timeleft is negative, return 0, else return the number of seconds left - return (TimeLeft > 0 ? TimeLeft : 0); + return (time_left > 0 ? time_left : 0); } return -1; @@ -2698,15 +2735,15 @@ int ClientTaskState::IsTaskCompleted(int task_id) // +1 if the task has been completed // 0 if the task has not been completed - if (!(RuleB(TaskSystem, RecordCompletedTasks))) { return -1; } + if (!(RuleB(TaskSystem, RecordCompletedTasks))) { + return -1; + } - for (unsigned int i = 0; i < completed_tasks.size(); i++) { - Log(Logs::General, - Logs::Tasks, - "[UPDATE] Comparing completed task %i with %i", - completed_tasks[i].task_id, - task_id); - if (completed_tasks[i].task_id == task_id) { return 1; } + for (auto &completed_task : completed_tasks) { + LogTasks("[IsTaskCompleted] Comparing compelted task [{}] with [{}]", completed_task.task_id, task_id); + if (completed_task.task_id == task_id) { + return 1; + } } return 0; @@ -2714,21 +2751,22 @@ int ClientTaskState::IsTaskCompleted(int task_id) bool TaskManager::IsTaskRepeatable(int task_id) { + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + return false; + } - if ((task_id <= 0) || (task_id >= MAXTASKS)) { return false; } + TaskInformation *p_task_data = p_task_manager->p_task_data[task_id]; + if (p_task_data == nullptr) { + return false; + } - TaskInformation *Task = p_task_manager->p_task_data[task_id]; - - if (Task == nullptr) { return false; } - - return Task->repeatable; + return p_task_data->repeatable; } bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) { // Returns true if the Task in the specified slot has a time limit that has been exceeded. auto info = GetClientTaskInfo(task_type, index); - if (info == nullptr) { return false; } @@ -2738,15 +2776,14 @@ bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) return false; } - int Now = time(nullptr); + int time_now = time(nullptr); - TaskInformation *Task = p_task_manager->p_task_data[info->task_id]; - - if (Task == nullptr) { + TaskInformation *task_data = p_task_manager->p_task_data[info->task_id]; + if (task_data == nullptr) { return false; } - return (Task->duration && (info->accepted_time + Task->duration <= Now)); + return (task_data->duration && (info->accepted_time + task_data->duration <= time_now)); } void ClientTaskState::TaskPeriodicChecks(Client *client) @@ -2832,102 +2869,105 @@ void Client::SendTaskComplete(int TaskIndex) { void ClientTaskState::SendTaskHistory(Client *client, int task_index) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Task History Requested for Completed Task Index %i", task_index); + LogTasks("[SendTaskHistory] Task history requested for completed task index [{}]", task_index); // We only sent the most recent 50 completed tasks, so we need to offset the Index the client sent to us. - int AdjustedTaskIndex = task_index; - + int adjusted_task_index = task_index; if (completed_tasks.size() > 50) { - AdjustedTaskIndex += (completed_tasks.size() - 50); + adjusted_task_index += (completed_tasks.size() - 50); } - if ((AdjustedTaskIndex < 0) || (AdjustedTaskIndex >= (int) completed_tasks.size())) { return; } + if ((adjusted_task_index < 0) || (adjusted_task_index >= (int) completed_tasks.size())) { + return; + } - int TaskID = completed_tasks[AdjustedTaskIndex].task_id; + int TaskID = completed_tasks[adjusted_task_index].task_id; - if ((TaskID < 0) || (TaskID > MAXTASKS)) { return; } + if ((TaskID < 0) || (TaskID > MAXTASKS)) { + return; + } TaskInformation *Task = p_task_manager->p_task_data[TaskID]; - if (Task == nullptr) { return; } + if (Task == nullptr) { + return; + } - TaskHistoryReplyHeader_Struct *ths; - TaskHistoryReplyData1_Struct *thd1; - TaskHistoryReplyData2_Struct *thd2; + TaskHistoryReplyHeader_Struct *task_history_reply; + TaskHistoryReplyData1_Struct *task_history_reply_data_1; + TaskHistoryReplyData2_Struct *task_history_reply_data_2; - char *Ptr; + char *reply; - int CompletedActivityCount = 0;; - - int PacketLength = sizeof(TaskHistoryReplyHeader_Struct); + int completed_activity_count = 0; + int packet_length = sizeof(TaskHistoryReplyHeader_Struct); for (int i = 0; i < Task->activity_count; i++) { - if (completed_tasks[AdjustedTaskIndex].activity_done[i]) { - CompletedActivityCount++; - PacketLength = PacketLength + sizeof(TaskHistoryReplyData1_Struct) + - Task->activity_information[i].target_name.size() + 1 + - Task->activity_information[i].item_list.size() + 1 + - sizeof(TaskHistoryReplyData2_Struct) + - Task->activity_information[i].description_override.size() + 1; + if (completed_tasks[adjusted_task_index].activity_done[i]) { + completed_activity_count++; + packet_length = packet_length + sizeof(TaskHistoryReplyData1_Struct) + + Task->activity_information[i].target_name.size() + 1 + + Task->activity_information[i].item_list.size() + 1 + + sizeof(TaskHistoryReplyData2_Struct) + + Task->activity_information[i].description_override.size() + 1; } } - auto outapp = new EQApplicationPacket(OP_TaskHistoryReply, PacketLength); + auto outapp = new EQApplicationPacket(OP_TaskHistoryReply, packet_length); - ths = (TaskHistoryReplyHeader_Struct *) outapp->pBuffer; + task_history_reply = (TaskHistoryReplyHeader_Struct *) outapp->pBuffer; // We use the TaskIndex the client sent in the request - ths->TaskID = task_index; + task_history_reply->TaskID = task_index; + task_history_reply->ActivityCount = completed_activity_count; - ths->ActivityCount = CompletedActivityCount; - - Ptr = (char *) ths + sizeof(TaskHistoryReplyHeader_Struct); + reply = (char *) task_history_reply + sizeof(TaskHistoryReplyHeader_Struct); for (int i = 0; i < Task->activity_count; i++) { - if (completed_tasks[AdjustedTaskIndex].activity_done[i]) { - thd1 = (TaskHistoryReplyData1_Struct *) Ptr; - thd1->ActivityType = Task->activity_information[i].activity_type; - Ptr = (char *) thd1 + sizeof(TaskHistoryReplyData1_Struct); - VARSTRUCT_ENCODE_STRING(Ptr, Task->activity_information[i].target_name.c_str()); - VARSTRUCT_ENCODE_STRING(Ptr, Task->activity_information[i].item_list.c_str()); - thd2 = (TaskHistoryReplyData2_Struct *) Ptr; - thd2->GoalCount = Task->activity_information[i].goal_count; - thd2->unknown04 = 0xffffffff; - thd2->unknown08 = 0xffffffff; - thd2->ZoneID = Task->activity_information[i].zone_ids.empty() ? 0 + if (completed_tasks[adjusted_task_index].activity_done[i]) { + task_history_reply_data_1 = (TaskHistoryReplyData1_Struct *) reply; + task_history_reply_data_1->ActivityType = Task->activity_information[i].activity_type; + reply = (char *) task_history_reply_data_1 + sizeof(TaskHistoryReplyData1_Struct); + VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].target_name.c_str()); + VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].item_list.c_str()); + task_history_reply_data_2 = (TaskHistoryReplyData2_Struct *) reply; + task_history_reply_data_2->GoalCount = Task->activity_information[i].goal_count; + task_history_reply_data_2->unknown04 = 0xffffffff; + task_history_reply_data_2->unknown08 = 0xffffffff; + task_history_reply_data_2->ZoneID = Task->activity_information[i].zone_ids.empty() ? 0 : Task->activity_information[i].zone_ids.front(); - thd2->unknown16 = 0x00000000; - Ptr = (char *) thd2 + sizeof(TaskHistoryReplyData2_Struct); - VARSTRUCT_ENCODE_STRING(Ptr, Task->activity_information[i].description_override.c_str()); + task_history_reply_data_2->unknown16 = 0x00000000; + reply = (char *) task_history_reply_data_2 + sizeof(TaskHistoryReplyData2_Struct); + VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].description_override.c_str()); } } client->QueuePacket(outapp); safe_delete(outapp); - - } -void -Client::SendTaskActivityComplete(int task_id, int activity_id, int task_index, TaskType task_type, int task_incomplete) +void Client::SendTaskActivityComplete( + int task_id, + int activity_id, + int task_index, + TaskType task_type, + int task_incomplete +) { - // 0x54eb - - TaskActivityComplete_Struct *tac; + TaskActivityComplete_Struct *task_activity_complete; auto outapp = new EQApplicationPacket(OP_TaskActivityComplete, sizeof(TaskActivityComplete_Struct)); - tac = (TaskActivityComplete_Struct *) outapp->pBuffer; - - tac->TaskIndex = task_index; - tac->TaskType = static_cast(task_type); - tac->TaskID = task_id; - tac->ActivityID = activity_id; - tac->task_completed = 0x00000001; - tac->stage_complete = task_incomplete; + task_activity_complete = (TaskActivityComplete_Struct *) outapp->pBuffer; + task_activity_complete->TaskIndex = task_index; + task_activity_complete->TaskType = static_cast(task_type); + task_activity_complete->TaskID = task_id; + task_activity_complete->ActivityID = activity_id; + task_activity_complete->task_completed = 0x00000001; + task_activity_complete->stage_complete = task_incomplete; QueuePacket(outapp); safe_delete(outapp); @@ -2942,20 +2982,19 @@ void Client::SendTaskFailed(int task_id, int task_index, TaskType task_type) buf[23] = '\0'; parse->EventPlayer(EVENT_TASK_FAIL, this, buf, 0); - TaskActivityComplete_Struct *tac; + TaskActivityComplete_Struct *task_activity_complete; auto outapp = new EQApplicationPacket(OP_TaskActivityComplete, sizeof(TaskActivityComplete_Struct)); - tac = (TaskActivityComplete_Struct *) outapp->pBuffer; + task_activity_complete = (TaskActivityComplete_Struct *) outapp->pBuffer; + task_activity_complete->TaskIndex = task_index; + task_activity_complete->TaskType = static_cast(task_type); + task_activity_complete->TaskID = task_id; + task_activity_complete->ActivityID = 0; + task_activity_complete->task_completed = 0; //Fail + task_activity_complete->stage_complete = 0; // 0 for task complete or failed. - tac->TaskIndex = task_index; - tac->TaskType = static_cast(task_type); - tac->TaskID = task_id; - tac->ActivityID = 0; - tac->task_completed = 0; //Fail - tac->stage_complete = 0; // 0 for task complete or failed. - - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskFailed"); + LogTasks("[SendTaskFailed] Sending failure to client [{}]", GetCleanName()); QueuePacket(outapp); safe_delete(outapp); @@ -2963,23 +3002,24 @@ void Client::SendTaskFailed(int task_id, int task_index, TaskType task_type) void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *client_task_state) { - - int PacketLength = 4; - - + int packet_length = 4; //vector::const_iterator iterator; - // The client only display the first 50 Completed Tasks send, so send the 50 most recent - int FirstTaskToSend = 0; - int LastTaskToSend = client_task_state->completed_tasks.size(); + int first_task_to_send = 0; + int last_task_to_send = client_task_state->completed_tasks.size(); if (client_task_state->completed_tasks.size() > 50) { - FirstTaskToSend = client_task_state->completed_tasks.size() - 50; + first_task_to_send = client_task_state->completed_tasks.size() - 50; } - Log(Logs::General, Logs::Tasks, "[UPDATE] Completed Task Count: %i, First Task to send is %i, Last is %i", - client_task_state->completed_tasks.size(), FirstTaskToSend, LastTaskToSend); + LogTasks( + "[SendCompletedTasksToClient] completed task count [{}] first tank to send is [{}] last is [{}]", + client_task_state->completed_tasks.size(), + first_task_to_send, + last_task_to_send + ); + /* for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { int task_id = (*iterator).task_id; @@ -2987,34 +3027,33 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *client_ PacketLength = PacketLength + 8 + strlen(Tasks[task_id]->title) + 1; } */ - for (int i = FirstTaskToSend; i < LastTaskToSend; i++) { + for (int i = first_task_to_send; i < last_task_to_send; i++) { int TaskID = client_task_state->completed_tasks[i].task_id; if (p_task_data[TaskID] == nullptr) { continue; } - PacketLength = PacketLength + 8 + p_task_data[TaskID]->title.size() + 1; + packet_length = packet_length + 8 + p_task_data[TaskID]->title.size() + 1; } - auto outapp = new EQApplicationPacket(OP_CompletedTasks, PacketLength); + auto outapp = new EQApplicationPacket(OP_CompletedTasks, packet_length); char *buf = (char *) outapp->pBuffer; //*(uint32 *)buf = activity_state->CompletedTasks.size(); - *(uint32 *) buf = LastTaskToSend - FirstTaskToSend; + *(uint32 *) buf = last_task_to_send - first_task_to_send; buf = buf + 4; //for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { // int task_id = (*iterator).task_id; - for (int i = FirstTaskToSend; i < LastTaskToSend; i++) { - int TaskID = client_task_state->completed_tasks[i].task_id; - if (p_task_data[TaskID] == nullptr) { continue; } - *(uint32 *) buf = TaskID; + for (int i = first_task_to_send; i < last_task_to_send; i++) { + int task_id = client_task_state->completed_tasks[i].task_id; + if (p_task_data[task_id] == nullptr) { continue; } + *(uint32 *) buf = task_id; buf = buf + 4; - sprintf(buf, "%s", p_task_data[TaskID]->title.c_str()); + sprintf(buf, "%s", p_task_data[task_id]->title.c_str()); buf = buf + strlen(buf) + 1; //*(uint32 *)buf = (*iterator).CompletedTime; *(uint32 *) buf = client_task_state->completed_tasks[i].completed_time; buf = buf + 4; } - c->QueuePacket(outapp); safe_delete(outapp); } @@ -3025,8 +3064,7 @@ void TaskManager::SendTaskActivityShort(Client *client, int task_id, int activit // This activity_information Packet is sent for activities that have not yet been unlocked and appear as ??? // in the client. - TaskActivityShort_Struct *tass; - + TaskActivityShort_Struct *task_activity_short; if (client->ClientVersionBit() & EQ::versions::maskRoFAndLater) { auto outapp = new EQApplicationPacket(OP_TaskActivity, 25); outapp->WriteUInt32(client_task_index); @@ -3043,16 +3081,14 @@ void TaskManager::SendTaskActivityShort(Client *client, int task_id, int activit auto outapp = new EQApplicationPacket(OP_TaskActivity, sizeof(TaskActivityShort_Struct)); - tass = (TaskActivityShort_Struct *) outapp->pBuffer; - - tass->TaskSequenceNumber = client_task_index; - tass->unknown2 = static_cast(p_task_data[task_id]->type); - tass->TaskID = task_id; - tass->ActivityID = activity_id; - tass->unknown3 = 0x000000; - tass->ActivityType = 0xffffffff; - tass->unknown4 = 0x00000000; - + task_activity_short = (TaskActivityShort_Struct *) outapp->pBuffer; + task_activity_short->TaskSequenceNumber = client_task_index; + task_activity_short->unknown2 = static_cast(p_task_data[task_id]->type); + task_activity_short->TaskID = task_id; + task_activity_short->ActivityID = activity_id; + task_activity_short->unknown3 = 0x000000; + task_activity_short->ActivityType = 0xffffffff; + task_activity_short->unknown4 = 0x00000000; client->QueuePacket(outapp); safe_delete(outapp); @@ -3223,45 +3259,45 @@ void TaskManager::SendActiveTasksToClient(Client *client, bool task_complete) return; } - for (int TaskIndex = 0; TaskIndex < MAXACTIVEQUESTS + 1; TaskIndex++) { - int TaskID = state->ActiveTasks[TaskIndex].task_id; - if ((TaskID == 0) || (p_task_data[TaskID] == 0)) { + for (int task_index = 0; task_index < MAXACTIVEQUESTS + 1; task_index++) { + int task_id = state->active_tasks[task_index].task_id; + if ((task_id == 0) || (p_task_data[task_id] == 0)) { continue; } - int StartTime = state->ActiveTasks[TaskIndex].accepted_time; + int start_time = state->active_tasks[task_index].accepted_time; SendActiveTaskDescription( - client, TaskID, state->ActiveTasks[TaskIndex], StartTime, p_task_data[TaskID]->duration, + client, task_id, state->active_tasks[task_index], start_time, p_task_data[task_id]->duration, false ); - Log(Logs::General, Logs::Tasks, "[UPDATE] SendActiveTasksToClient: Task %i, Activities: %i", TaskID, - GetActivityCount(TaskID)); + Log(Logs::General, Logs::Tasks, "[UPDATE] SendActiveTasksToClient: Task %i, Activities: %i", task_id, + GetActivityCount(task_id)); - int Sequence = 0; - int fixed_index = p_task_data[TaskID]->type == TaskType::Task ? 0 : TaskIndex - 1; // hmmm fuck - for (int Activity = 0; Activity < GetActivityCount(TaskID); Activity++) { - if (client->GetTaskActivityState(p_task_data[TaskID]->type, fixed_index, Activity) != ActivityHidden) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i, %i Complete=%i", TaskID, - Activity, fixed_index, task_complete); - if (Activity == GetActivityCount(TaskID) - 1) { + int sequence = 0; + int fixed_index = p_task_data[task_id]->type == TaskType::Task ? 0 : task_index - 1; // hmmm fuck + for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { + if (client->GetTaskActivityState(p_task_data[task_id]->type, fixed_index, activity_id) != ActivityHidden) { + Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i, %i Complete=%i", task_id, + activity_id, fixed_index, task_complete); + if (activity_id == GetActivityCount(task_id) - 1) { SendTaskActivityLong( - client, TaskID, Activity, fixed_index, - p_task_data[TaskID]->activity_information[Activity].optional, task_complete + client, task_id, activity_id, fixed_index, + p_task_data[task_id]->activity_information[activity_id].optional, task_complete ); } else { SendTaskActivityLong( - client, TaskID, Activity, fixed_index, - p_task_data[TaskID]->activity_information[Activity].optional, 0 + client, task_id, activity_id, fixed_index, + p_task_data[task_id]->activity_information[activity_id].optional, 0 ); } } else { - Log(Logs::General, Logs::Tasks, "[UPDATE] Short: %i, %i, %i", TaskID, Activity, + Log(Logs::General, Logs::Tasks, "[UPDATE] Short: %i, %i, %i", task_id, activity_id, fixed_index); - SendTaskActivityShort(client, TaskID, Activity, fixed_index); + SendTaskActivityShort(client, task_id, activity_id, fixed_index); } - Sequence++; + sequence++; } } } @@ -3271,46 +3307,45 @@ void TaskManager::SendSingleActiveTaskToClient( bool bring_up_task_journal ) { - int TaskID = task_info.task_id; - - if (TaskID == 0 || p_task_data[TaskID] == nullptr) { + int task_id = task_info.task_id; + if (task_id == 0 || p_task_data[task_id] == nullptr) { return; } - int StartTime = task_info.accepted_time; + int start_time = task_info.accepted_time; SendActiveTaskDescription( client, - TaskID, + task_id, task_info, - StartTime, - p_task_data[TaskID]->duration, + start_time, + p_task_data[task_id]->duration, bring_up_task_journal ); Log(Logs::General, Logs::Tasks, "[UPDATE] SendSingleActiveTasksToClient: Task %i, Activities: %i", - TaskID, - GetActivityCount(TaskID)); + task_id, + GetActivityCount(task_id)); - for (int Activity = 0; Activity < GetActivityCount(TaskID); Activity++) { - if (task_info.activity[Activity].activity_state != ActivityHidden) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i Complete=%i", TaskID, Activity, task_complete); - if (Activity == GetActivityCount(TaskID) - 1) { + for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { + if (task_info.activity[activity_id].activity_state != ActivityHidden) { + LogTasks("[SendSingleActiveTaskToClient] Long [{}] [{}] complete [{}]", task_id, activity_id, task_complete); + if (activity_id == GetActivityCount(task_id) - 1) { SendTaskActivityLong( - client, TaskID, Activity, task_info.slot, - p_task_data[TaskID]->activity_information[Activity].optional, task_complete + client, task_id, activity_id, task_info.slot, + p_task_data[task_id]->activity_information[activity_id].optional, task_complete ); } else { SendTaskActivityLong( - client, TaskID, Activity, task_info.slot, - p_task_data[TaskID]->activity_information[Activity].optional, 0 + client, task_id, activity_id, task_info.slot, + p_task_data[task_id]->activity_information[activity_id].optional, 0 ); } } else { - Log(Logs::General, Logs::Tasks, "[UPDATE] Short: %i, %i", TaskID, Activity); - SendTaskActivityShort(client, TaskID, Activity, task_info.slot); + LogTasks("[SendSingleActiveTaskToClient] Short [{}] [{}]", task_id, activity_id); + SendTaskActivityShort(client, task_id, activity_id, task_info.slot); } } } @@ -3563,7 +3598,7 @@ void ClientTaskState::CancelTask(Client *client, int sequence_number, TaskType t void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType task_type) { - int characterID = client->CharacterID(); + int character_id = client->CharacterID(); Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState Cancel Task %i ", sequence_number); int task_id = -1; @@ -3585,7 +3620,7 @@ void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType t std::string query = StringFormat( "DELETE FROM character_activities WHERE charid=%i AND taskid = %i", - characterID, task_id + character_id, task_id ); auto results = database.QueryDatabase(query); if (!results.Success()) { @@ -3596,7 +3631,7 @@ void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType t Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask: %s", query.c_str()); query = StringFormat( - "DELETE FROM character_tasks WHERE charid=%i AND taskid = %i AND type=%i", characterID, + "DELETE FROM character_tasks WHERE charid=%i AND taskid = %i AND type=%i", character_id, task_id, static_cast(task_type)); results = database.QueryDatabase(query); if (!results.Success()) diff --git a/zone/tasks.h b/zone/tasks.h index d9a7c8375..17f95c6e7 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -289,7 +289,7 @@ private: ClientTaskInformation active_task; // only one ClientTaskInformation active_quests[MAXACTIVEQUESTS]; }; - ClientTaskInformation ActiveTasks[MAXACTIVEQUESTS + 1]; + ClientTaskInformation active_tasks[MAXACTIVEQUESTS + 1]; }; // Shared tasks should be limited to 1 as well std::vector enabled_tasks; From 19e9c0bc2220668a7391542c66a6fe10dd9697f2 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 03:44:36 -0600 Subject: [PATCH 10/26] Move ClientTaskState::RemoveTask to repository methods --- zone/tasks.cpp | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 26e4dbea8..77d08d5dd 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -3618,27 +3618,15 @@ void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType t break; } - std::string query = StringFormat( - "DELETE FROM character_activities WHERE charid=%i AND taskid = %i", - character_id, task_id + CharacterActivitiesRepository::DeleteWhere( + database, + fmt::format("charid = {} AND taskid = {}", character_id, task_id) ); - auto results = database.QueryDatabase(query); - if (!results.Success()) { - LogError("[TASKS] Error in CientTaskState::CancelTask [{}]", - results.ErrorMessage().c_str()); - return; - } - Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask: %s", query.c_str()); - query = StringFormat( - "DELETE FROM character_tasks WHERE charid=%i AND taskid = %i AND type=%i", character_id, - task_id, static_cast(task_type)); - results = database.QueryDatabase(query); - if (!results.Success()) - LogError("[TASKS] Error in CientTaskState::CancelTask [{}]", - results.ErrorMessage().c_str()); - - Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask: %s", query.c_str()); + CharacterTasksRepository::DeleteWhere( + database, + fmt::format("charid = {} AND taskid = {} AND type = {}", character_id, task_id, static_cast(task_type)) + ); switch (task_type) { case TaskType::Task: From fac75a3ae098ef081f4e02c26e8ccdf5ad44c1ca Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 03:46:03 -0600 Subject: [PATCH 11/26] Move ClientTaskState::RemoveTaskByTaskID to repository methods --- zone/tasks.cpp | 34 +++++++++++----------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 77d08d5dd..606393c01 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -3329,7 +3329,10 @@ void TaskManager::SendSingleActiveTaskToClient( for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { if (task_info.activity[activity_id].activity_state != ActivityHidden) { - LogTasks("[SendSingleActiveTaskToClient] Long [{}] [{}] complete [{}]", task_id, activity_id, task_complete); + LogTasks("[SendSingleActiveTaskToClient] Long [{}] [{}] complete [{}]", + task_id, + activity_id, + task_complete); if (activity_id == GetActivityCount(task_id) - 1) { SendTaskActivityLong( client, task_id, activity_id, task_info.slot, @@ -3647,31 +3650,16 @@ void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) { auto task_type = p_task_manager->GetTaskType(task_id); int character_id = client->CharacterID(); - Log(Logs::General, Logs::Tasks, "[UPDATE] RemoveTaskByTaskID: %d", task_id); - std::string query = fmt::format( - "DELETE FROM character_activities WHERE charid = {} AND taskid = {}", - character_id, - task_id - ); - auto results = database.QueryDatabase(query); - if (!results.Success()) { - LogError("[TASKS] Error in CientTaskState::RemoveTaskByTaskID [{}]", results.ErrorMessage().c_str()); - return; - } - LogTasks("[UPDATE] RemoveTaskByTaskID: {}", query.c_str()); - query = fmt::format( - "DELETE FROM character_tasks WHERE charid = {} AND taskid = {} AND type = {}", - character_id, - task_id, - (int) task_type + CharacterActivitiesRepository::DeleteWhere( + database, + fmt::format("charid = {} AND taskid = {}", character_id, task_id) ); - results = database.QueryDatabase(query); - if (!results.Success()) { - LogError("[TASKS] Error in ClientTaskState::RemoveTaskByTaskID [{}]", results.ErrorMessage().c_str()); - } - LogTasks("[UPDATE] RemoveTaskByTaskID: {}", query.c_str()); + CharacterTasksRepository::DeleteWhere( + database, + fmt::format("charid = {} AND taskid = {} AND type = {}", character_id, task_id, (int) task_type) + ); switch (task_type) { case TaskType::Task: { From 65f2f823a87e8f4b01e9a8fd05dc9757766dbb1b Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 03:57:46 -0600 Subject: [PATCH 12/26] More refactors --- zone/tasks.cpp | 164 ++++++++++++++++++++++++------------------------- 1 file changed, 80 insertions(+), 84 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 606393c01..5359df1bc 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -46,6 +46,7 @@ Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net) #include "../common/repositories/task_activities_repository.h" #include "../common/repositories/character_activities_repository.h" #include "../common/repositories/character_tasks_repository.h" +#include "../common/repositories/proximities_repository.h" extern QueryServ *QServ; @@ -3745,8 +3746,8 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id // only Quests can have more than one, so don't need to check others if (task->type == TaskType::Quest) { - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { + for (auto &active_quest : active_quests) { + if (active_quest.task_id == task_id) { client->Message(Chat::Red, "You have already been assigned this task."); return; } @@ -3805,11 +3806,11 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id active_slot->updated = true; active_slot->current_step = -1; - for (int i = 0; i < p_task_manager->p_task_data[task_id]->activity_count; i++) { - active_slot->activity[i].activity_id = i; - active_slot->activity[i].done_count = 0; - active_slot->activity[i].activity_state = ActivityHidden; - active_slot->activity[i].updated = true; + for (int activity_id = 0; activity_id < p_task_manager->p_task_data[task_id]->activity_count; activity_id++) { + active_slot->activity[activity_id].activity_id = activity_id; + active_slot->activity[activity_id].done_count = 0; + active_slot->activity[activity_id].activity_state = ActivityHidden; + active_slot->activity[activity_id].updated = true; } UnlockActivities(client->CharacterID(), *active_slot); @@ -3822,7 +3823,8 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id client->Message( Chat::White, "You have been assigned the task '%s'.", - p_task_manager->p_task_data[task_id]->title.c_str()); + p_task_manager->p_task_data[task_id]->title.c_str() + ); p_task_manager->SaveClientState(client, this); std::string buf = std::to_string(task_id); @@ -3834,25 +3836,26 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id void ClientTaskState::ProcessTaskProximities(Client *client, float x, float y, float z) { + float last_x = client->ProximityX(); + float last_y = client->ProximityY(); + float last_z = client->ProximityZ(); - float LastX = client->ProximityX(); - float LastY = client->ProximityY(); - float LastZ = client->ProximityZ(); + if ((last_x == x) && (last_y == y) && (last_z == z)) { + return; + } - if ((LastX == x) && (LastY == y) && (LastZ == z)) { return; } - - Log(Logs::General, Logs::Tasks, "[PROXIMITY] Checking proximities for Position %8.3f, %8.3f, %8.3f", x, y, z); - int ExploreID = p_task_manager->proximity_manager.CheckProximities(x, y, z); - - if (ExploreID > 0) { - Log(Logs::General, - Logs::Tasks, - "[PROXIMITY] Position %8.3f, %8.3f, %8.3f is within proximity %i", + LogTasksDetail("[ProcessTaskProximities] Checking proximities for Position x[{}] y[{}] z[{}]", x, y, z); + int explore_id = p_task_manager->proximity_manager.CheckProximities(x, y, z); + if (explore_id > 0) { + LogTasksDetail( + "[ProcessTaskProximities] Position x[{}] y[{}] z[{}] is within proximity explore_id [{}]", x, y, z, - ExploreID); - UpdateTasksOnExplore(client, ExploreID); + explore_id + ); + + UpdateTasksOnExplore(client, explore_id); } } @@ -3866,14 +3869,9 @@ TaskGoalListManager::~TaskGoalListManager() {} bool TaskGoalListManager::LoadLists() { task_goal_lists.clear(); - - const char *ERR_MYSQLERROR = "Error in TaskGoalListManager::LoadLists: %s %s"; - goal_lists_count = 0; - std::string query = "SELECT `listid`, COUNT(`entry`) " - "FROM `goallists` GROUP by `listid` " - "ORDER BY `listid`"; + std::string query = "SELECT `listid`, COUNT(`entry`) FROM `goallists` GROUP by `listid` ORDER BY `listid`"; auto results = content_db.QueryDatabase(query); if (!results.Success()) { return false; @@ -3886,12 +3884,12 @@ bool TaskGoalListManager::LoadLists() int list_index = 0; for (auto row = results.begin(); row != results.end(); ++row) { - int listID = atoi(row[0]); - int listSize = atoi(row[1]); + int list_id = atoi(row[0]); + int list_size = atoi(row[1]); - task_goal_lists.push_back({listID, 0, 0}); + task_goal_lists.push_back({list_id, 0, 0}); - task_goal_lists[list_index].GoalItemEntries.reserve(listSize); + task_goal_lists[list_index].GoalItemEntries.reserve(list_size); list_index++; } @@ -3946,51 +3944,56 @@ int TaskGoalListManager::GetListByID(int list_id) int TaskGoalListManager::GetFirstEntry(int list_id) { - int ListIndex = GetListByID(list_id); + int list_by_id = GetListByID(list_id); - if ((ListIndex < 0) || (ListIndex >= goal_lists_count)) { return -1; } + if ((list_by_id < 0) || (list_by_id >= goal_lists_count)) { + return -1; + } - if (task_goal_lists[ListIndex].GoalItemEntries.empty()) { return -1; } + if (task_goal_lists[list_by_id].GoalItemEntries.empty()) { + return -1; + } - return task_goal_lists[ListIndex].GoalItemEntries[0]; + return task_goal_lists[list_by_id].GoalItemEntries[0]; } std::vector TaskGoalListManager::GetListContents(int list_index) { - std::vector ListContents; - int ListIndex = GetListByID(list_index); + std::vector list_contents; + int list_by_id = GetListByID(list_index); - if ((ListIndex < 0) || (ListIndex >= goal_lists_count)) { return ListContents; } + if ((list_by_id < 0) || (list_by_id >= goal_lists_count)) { + return list_contents; + } - ListContents = task_goal_lists[ListIndex].GoalItemEntries; + list_contents = task_goal_lists[list_by_id].GoalItemEntries; - return ListContents; + return list_contents; } bool TaskGoalListManager::IsInList(int list_id, int entry) { Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i)", list_id, entry); - int ListIndex = GetListByID(list_id); + int list_index = GetListByID(list_id); - if ((ListIndex < 0) || (ListIndex >= goal_lists_count)) { + if ((list_index < 0) || (list_index >= goal_lists_count)) { return false; } - if ((entry < task_goal_lists[ListIndex].Min) || (entry > task_goal_lists[ListIndex].Max)) { + if ((entry < task_goal_lists[list_index].Min) || (entry > task_goal_lists[list_index].Max)) { return false; } - int FirstEntry = 0; - auto &task = task_goal_lists[ListIndex]; - - auto it = std::find(task.GoalItemEntries.begin(), task.GoalItemEntries.end(), entry); + int first_entry = 0; + auto &task = task_goal_lists[list_index]; + auto it = std::find(task.GoalItemEntries.begin(), task.GoalItemEntries.end(), entry); if (it == task.GoalItemEntries.end()) { return false; } - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i) returning true", ListIndex, + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i) returning true", list_index, entry); return true; } @@ -4009,65 +4012,58 @@ TaskProximityManager::~TaskProximityManager() bool TaskProximityManager::LoadProximities(int zone_id) { - TaskProximity proximity; - - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskProximityManager::LoadProximities Called for zone %i", zone_id); + TaskProximity proximity{}; task_proximities.clear(); - std::string query = StringFormat( - "SELECT `exploreid`, `minx`, `maxx`, " - "`miny`, `maxy`, `minz`, `maxz` " - "FROM `proximities` WHERE `zoneid` = %i " - "ORDER BY `zoneid` ASC", zone_id + auto proximities = ProximitiesRepository::GetWhere( + content_db, + fmt::format("zoneid = {} ORDER BY `zoneid` ASC", zone_id) ); - auto results = content_db.QueryDatabase(query); - if (!results.Success()) { - return false; - } - for (auto row = results.begin(); row != results.end(); ++row) { - proximity.explore_id = atoi(row[0]); - proximity.min_x = atof(row[1]); - proximity.max_x = atof(row[2]); - proximity.min_y = atof(row[3]); - proximity.max_y = atof(row[4]); - proximity.min_z = atof(row[5]); - proximity.max_z = atof(row[6]); + for (auto &row: proximities) { + proximity.explore_id = row.exploreid; + proximity.min_x = row.minx; + proximity.max_x = row.maxx; + proximity.min_y = row.miny; + proximity.max_y = row.maxy; + proximity.min_z = row.minz; + proximity.max_z = row.maxz; task_proximities.push_back(proximity); } - return true; + LogTasks("Loaded [{}] Task Proximities", proximities.size()); + return true; } int TaskProximityManager::CheckProximities(float x, float y, float z) { + for (auto &task_proximity : task_proximities) { - for (unsigned int i = 0; i < task_proximities.size(); i++) { + TaskProximity *p_proximity = &task_proximity; - TaskProximity *P = &task_proximities[i]; - - Log(Logs::General, + Log( + Logs::General, Logs::Tasks, "[PROXIMITY] Checking %8.3f, %8.3f, %8.3f against %8.3f, %8.3f, %8.3f, %8.3f, %8.3f, %8.3f", x, y, z, - P->min_x, - P->max_x, - P->min_y, - P->max_y, - P->min_z, - P->max_z); + p_proximity->min_x, + p_proximity->max_x, + p_proximity->min_y, + p_proximity->max_y, + p_proximity->min_z, + p_proximity->max_z + ); - if (x < P->min_x || x > P->max_x || y < P->min_y || y > P->max_y || - z < P->min_z || z > P->max_z) { + if (x < p_proximity->min_x || x > p_proximity->max_x || y < p_proximity->min_y || y > p_proximity->max_y || + z < p_proximity->min_z || z > p_proximity->max_z) { continue; } - return P->explore_id; - + return p_proximity->explore_id; } return 0; From 8d7fdd654944ec62339ed282b1ed15b4f199d8cd Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 04:12:11 -0600 Subject: [PATCH 13/26] More cleanups --- zone/tasks.cpp | 335 ++++++++++++++++++++++++++----------------------- 1 file changed, 176 insertions(+), 159 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 5359df1bc..ee8043976 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -31,10 +31,8 @@ Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net) #include "../common/string_util.h" #include "../common/say_link.h" #include "zonedb.h" -#include "zone_store.h" #include "../common/repositories/goallists_repository.h" #include "client.h" -#include "entity.h" #include "mob.h" #include "string_ids.h" @@ -324,13 +322,17 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s "%i task_id %i", character_id, slot, task_id); - std::string query = StringFormat( + std::string query = StringFormat( "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime) " "VALUES (%i, %i, %i, %i, %i)", - character_id, task_id, slot, static_cast(p_task_data[task_id]->type), + character_id, + task_id, + slot, + static_cast(p_task_data[task_id]->type), active_task.accepted_time ); - auto results = database.QueryDatabase(query); + + auto results = database.QueryDatabase(query); if (!results.Success()) { LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); } @@ -343,41 +345,41 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s "REPLACE INTO character_activities (charid, taskid, activityid, donecount, completed) " "VALUES "; - int updatedActivityCount = 0; - for (int activityIndex = 0; activityIndex < p_task_data[task_id]->activity_count; ++activityIndex) { + int updated_activity_count = 0; - if (!active_task.activity[activityIndex].updated) { + for (int activity_index = 0; activity_index < p_task_data[task_id]->activity_count; ++activity_index) { + if (!active_task.activity[activity_index].updated) { continue; } Log(Logs::General, Logs::Tasks, "[CLIENTSAVE] TaskManager::SaveClientSate for character ID %d, Updating activity_information " "%i, %i", - character_id, slot, activityIndex); + character_id, slot, activity_index); - if (updatedActivityCount == 0) { + if (updated_activity_count == 0) { query += StringFormat( - "(%i, %i, %i, %i, %i)", character_id, task_id, activityIndex, - active_task.activity[activityIndex].done_count, - active_task.activity[activityIndex].activity_state == + "(%i, %i, %i, %i, %i)", character_id, task_id, activity_index, + active_task.activity[activity_index].done_count, + active_task.activity[activity_index].activity_state == ActivityCompleted ); } else { query += StringFormat( - ", (%i, %i, %i, %i, %i)", character_id, task_id, activityIndex, - active_task.activity[activityIndex].done_count, - active_task.activity[activityIndex].activity_state == + ", (%i, %i, %i, %i, %i)", character_id, task_id, activity_index, + active_task.activity[activity_index].done_count, + active_task.activity[activity_index].activity_state == ActivityCompleted ); } - updatedActivityCount++; + updated_activity_count++; } - if (updatedActivityCount == 0) { + if (updated_activity_count == 0) { continue; } @@ -390,10 +392,10 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s } active_task.updated = false; - for (int activityIndex = 0; - activityIndex < p_task_data[task_id]->activity_count; - ++activityIndex) - active_task.activity[activityIndex].updated = false; + for (int activity_index = 0; + activity_index < p_task_data[task_id]->activity_count; + ++activity_index) + active_task.activity[activity_index].updated = false; } } @@ -403,18 +405,18 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s return true; } - const char *completedTaskQuery = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " - "VALUES (%i, %i, %i, %i)"; + const char *completed_task_query = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " + "VALUES (%i, %i, %i, %i)"; - for (unsigned int i = client_task_state->last_completed_task_loaded; - i < client_task_state->completed_tasks.size(); - i++) { + for (unsigned int task_index = client_task_state->last_completed_task_loaded; + task_index < client_task_state->completed_tasks.size(); + task_index++) { Log(Logs::General, Logs::Tasks, - "[CLIENTSAVE] TaskManager::SaveClientState Saving Completed Task at slot %i", i); - int taskID = client_task_state->completed_tasks[i].task_id; + "[CLIENTSAVE] TaskManager::SaveClientState Saving Completed Task at slot %i", task_index); + int task_id = client_task_state->completed_tasks[task_index].task_id; - if ((taskID <= 0) || (taskID >= MAXTASKS) || (p_task_data[taskID] == nullptr)) { + if ((task_id <= 0) || (task_id >= MAXTASKS) || (p_task_data[task_id] == nullptr)) { continue; } @@ -422,15 +424,15 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s // This indicates this task was completed at the given time. We infer that all // none optional activities were completed. // - std::string query = - StringFormat( - completedTaskQuery, - character_id, - client_task_state->completed_tasks[i].completed_time, - taskID, - -1 - ); - auto results = database.QueryDatabase(query); + std::string query = StringFormat( + completed_task_query, + character_id, + client_task_state->completed_tasks[task_index].completed_time, + task_id, + -1 + ); + + auto results = database.QueryDatabase(query); if (!results.Success()) { LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); continue; @@ -442,20 +444,23 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s } // Insert one record for each completed optional task. - - for (int j = 0; j < p_task_data[taskID]->activity_count; j++) { - if (!p_task_data[taskID]->activity_information[j].optional || - !client_task_state->completed_tasks[i].activity_done[j]) { + for (int activity_id = 0; activity_id < p_task_data[task_id]->activity_count; activity_id++) { + if (!p_task_data[task_id]->activity_information[activity_id].optional || + !client_task_state->completed_tasks[task_index].activity_done[activity_id]) { continue; } - query = StringFormat( - completedTaskQuery, character_id, client_task_state->completed_tasks[i].completed_time, - taskID, j + query = StringFormat( + completed_task_query, + character_id, + client_task_state->completed_tasks[task_index].completed_time, + task_id, activity_id ); + results = database.QueryDatabase(query); - if (!results.Success()) + if (!results.Success()) { LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); + } } } @@ -714,8 +719,8 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s // Check that there is an entry in the client task state for every activity_information in each task // This should only break if a ServerOP adds or deletes activites for a task that players already // have active, or due to a bug. - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - int task_id = client_task_state->active_tasks[i].task_id; + for (int task_index = 0; task_index < MAXACTIVEQUESTS + 1; task_index++) { + int task_id = client_task_state->active_tasks[task_index].task_id; if (task_id == TASKSLOTEMPTY) { continue; } @@ -724,15 +729,16 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s Chat::Red, "Active Task Slot %i, references a task (%i), that does not exist. " "Removing from memory. Contact a GM to resolve this.", - i, task_id + task_index, + task_id ); LogError("[LoadClientState] Character [{}] has task [{}] which does not exist", character_id, task_id); - client_task_state->active_tasks[i].task_id = TASKSLOTEMPTY; + client_task_state->active_tasks[task_index].task_id = TASKSLOTEMPTY; continue; } for (int activity_index = 0; activity_index < p_task_data[task_id]->activity_count; activity_index++) { - if (client_task_state->active_tasks[i].activity[activity_index].activity_id != activity_index) { + if (client_task_state->active_tasks[task_index].activity[activity_index].activity_id != activity_index) { client->Message( Chat::Red, "Active Task %i, %s. activity_information count does not match expected value." @@ -746,7 +752,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s activity_index, task_id ); - client_task_state->active_tasks[i].task_id = TASKSLOTEMPTY; + client_task_state->active_tasks[task_index].task_id = TASKSLOTEMPTY; break; } } @@ -826,7 +832,7 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li { // Check if the Task is enabled for this client - std::vector tasksDisabled; + std::vector tasks_disabled; for (int i = 0; i < task_count; i++) { auto iterator = enabled_tasks.begin(); @@ -847,7 +853,7 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li if (removeTask) { enabled_tasks.erase(iterator); - tasksDisabled.push_back(task_list[i]); + tasks_disabled.push_back(task_list[i]); } } @@ -856,22 +862,25 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li LogTasks("[DisableTask] enabled_tasks [{}]", enabled_task); } - if (tasksDisabled.empty()) { + if (tasks_disabled.empty()) { return; } std::stringstream queryStream; queryStream << StringFormat("DELETE FROM character_enabledtasks WHERE charid = %i AND (", character_id); - for (unsigned int i = 0; i < tasksDisabled.size(); i++) + for (unsigned int i = 0; i < tasks_disabled.size(); i++) queryStream - << (i ? StringFormat("taskid = %i ", tasksDisabled[i]) : StringFormat("OR taskid = %i ", tasksDisabled[i])); + << (i ? StringFormat("taskid = %i ", tasks_disabled[i]) : StringFormat( + "OR taskid = %i ", + tasks_disabled[i] + )); queryStream << ")"; std::string query = queryStream.str(); - if (tasksDisabled.size()) { + if (tasks_disabled.size()) { Log(Logs::General, Logs::Tasks, "[UPDATE] Executing query %s", query.c_str()); database.QueryDatabase(query); } @@ -885,7 +894,6 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li bool ClientTaskState::IsTaskEnabled(int task_id) { - std::vector::iterator Iterator; Iterator = enabled_tasks.begin(); @@ -904,48 +912,47 @@ int ClientTaskState::EnabledTaskCount(int task_set_id) // Return the number of tasks in TaskSet that this character is enabled for. - unsigned int EnabledTaskIndex = 0; - unsigned int TaskSetIndex = 0; - int EnabledTaskCount = 0; + unsigned int enabled_task_index = 0; + unsigned int task_set_index = 0; + int enabled_task_count = 0; if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } - while ((EnabledTaskIndex < enabled_tasks.size()) && - (TaskSetIndex < p_task_manager->task_sets[task_set_id].size())) { + while ((enabled_task_index < enabled_tasks.size()) && + (task_set_index < p_task_manager->task_sets[task_set_id].size())) { - if (enabled_tasks[EnabledTaskIndex] == p_task_manager->task_sets[task_set_id][TaskSetIndex]) { - - EnabledTaskCount++; - EnabledTaskIndex++; - TaskSetIndex++; + if (enabled_tasks[enabled_task_index] == p_task_manager->task_sets[task_set_id][task_set_index]) { + enabled_task_count++; + enabled_task_index++; + task_set_index++; continue; } - if (enabled_tasks[EnabledTaskIndex] < p_task_manager->task_sets[task_set_id][TaskSetIndex]) { - EnabledTaskIndex++; + if (enabled_tasks[enabled_task_index] < p_task_manager->task_sets[task_set_id][task_set_index]) { + enabled_task_index++; } else { - TaskSetIndex++; + task_set_index++; } } - return EnabledTaskCount; + return enabled_task_count; } int ClientTaskState::ActiveTasksInSet(int task_set_id) { + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { + return -1; + } - - if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } - - int Count = 0; - - for (unsigned int i = 0; i < p_task_manager->task_sets[task_set_id].size(); i++) - if (IsTaskActive(p_task_manager->task_sets[task_set_id][i])) { - Count++; + int active_task_in_set_count = 0; + for (int i : p_task_manager->task_sets[task_set_id]) { + if (IsTaskActive(i)) { + active_task_in_set_count++; } + } - return Count; + return active_task_in_set_count; } int ClientTaskState::CompletedTasksInSet(int task_set_id) @@ -1294,7 +1301,7 @@ void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, { LogTasks("SendTaskSelectorNew for [{}] Tasks", task_count); - int PlayerLevel = client->GetLevel(); + int player_level = client->GetLevel(); // Check if any of the tasks exist for (int i = 0; i < task_count; i++) { @@ -1303,10 +1310,9 @@ void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, } } - int valid_tasks_count = 0; - - for (int task_index = 0; task_index < task_count; task_index++) { - if (!ValidateLevel(task_list[task_index], PlayerLevel)) { + int valid_tasks_count = 0; + for (int task_index = 0; task_index < task_count; task_index++) { + if (!ValidateLevel(task_list[task_index], player_level)) { continue; } if (client->IsTaskActive(task_list[task_index])) { @@ -1332,7 +1338,7 @@ void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, buf.WriteUInt32(mob->GetID()); // TaskGiver for (int i = 0; i < task_count; i++) { // max 40 - if (!ValidateLevel(task_list[i], PlayerLevel)) { + if (!ValidateLevel(task_list[i], player_level)) { continue; } if (client->IsTaskActive(task_list[i])) { @@ -1454,7 +1460,6 @@ ClientTaskState::~ClientTaskState() int ClientTaskState::GetActiveTaskID(int index) { - // Return the task_id from the client's specified Active Task slot. if ((index < 0) || (index >= MAXACTIVEQUESTS)) { return 0; @@ -1556,7 +1561,7 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & // Stepped Mode // TODO: This code is probably more complex than it needs to be - bool CurrentStepComplete = true; + bool current_step_complete = true; Log(Logs::General, Logs::Tasks, "[UPDATE] Current Step is %i, Last Step is %i", task_info.current_step, p_task_information->last_step); @@ -1579,13 +1584,13 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & if (p_task_information->activity_information[Activity].step_number == (int) task_info.current_step) { if ((task_info.activity[Activity].activity_state != ActivityCompleted) && (!p_task_information->activity_information[Activity].optional)) { - CurrentStepComplete = false; + current_step_complete = false; all_activities_complete = false; break; } } } - if (!CurrentStepComplete) { + if (!current_step_complete) { break; } task_info.current_step++; @@ -1673,22 +1678,25 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np } // Check if there are any active kill activities for this p_task_information - auto p_task_information = p_task_manager->p_task_data[current_task->task_id]; - if (p_task_information == nullptr) { + auto p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { return false; } - for (int activity_id = 0; activity_id < p_task_information->activity_count; activity_id++) { + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + // We are not interested in completed or hidden activities - if (current_task->activity[activity_id].activity_state != ActivityActive) { + if (client_activity->activity_state != ActivityActive) { continue; } // We are only interested in Kill activities - if (p_task_information->activity_information[activity_id].activity_type != activity_type) { + if (activity_info->activity_type != activity_type) { continue; } // Is there a zone restriction on the activity_information ? - if (!p_task_information->activity_information[activity_id].CheckZone(zone->GetZoneID())) { + if (!activity_info->CheckZone(zone->GetZoneID())) { LogTasks( "[UPDATE] character [{}] task_id [{}] activity_id [{}] activity_type [{}] for NPC [{}] failed zone check", client->GetName(), @@ -1700,16 +1708,16 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np continue; } // Is the activity_information to kill this type of NPC ? - switch (p_task_information->activity_information[activity_id].goal_method) { + switch (activity_info->goal_method) { case METHODSINGLEID: - if (p_task_information->activity_information[activity_id].goal_id != npc_type_id) { + if (activity_info->goal_id != npc_type_id) { continue; } break; case METHODLIST: if (!p_task_manager->goal_list_manager.IsInList( - p_task_information->activity_information[activity_id].goal_id, + activity_info->goal_id, npc_type_id )) { continue; @@ -1722,7 +1730,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np } // We found an active p_task_information to kill this type of NPC, so increment the done count LogTasksDetail("Calling increment done count ByNPC"); - IncrementDoneCount(client, p_task_information, current_task->slot, activity_id); + IncrementDoneCount(client, p_task_data, current_task->slot, activity_id); is_updating = true; } } @@ -1746,26 +1754,28 @@ int ClientTaskState::ActiveSpeakTask(int npc_type_id) continue; } - TaskInformation *p_task_information = p_task_manager->p_task_data[current_task->task_id]; - if (p_task_information == nullptr) { + TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { continue; } - for (int activity_id = 0; activity_id < p_task_information->activity_count; activity_id++) { + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + // We are not interested in completed or hidden activities - if (current_task->activity[activity_id].activity_state != ActivityActive) { + if (client_activity->activity_state != ActivityActive) { continue; } - if (p_task_information->activity_information[activity_id].activity_type != ActivitySpeakWith) { + if (activity_info->activity_type != ActivitySpeakWith) { continue; } // Is there a zone restriction on the activity_information ? - if (!p_task_information->activity_information[activity_id].CheckZone(zone->GetZoneID())) { + if (!activity_info->CheckZone(zone->GetZoneID())) { continue; } // Is the activity_information to speak with this type of NPC ? - if (p_task_information->activity_information[activity_id].goal_method == METHODQUEST && - p_task_information->activity_information[activity_id].goal_id == npc_type_id) { + if (activity_info->goal_method == METHODQUEST && activity_info->goal_id == npc_type_id) { return current_task->task_id; } } @@ -1793,27 +1803,30 @@ int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) continue; } - TaskInformation *p_task_information = p_task_manager->p_task_data[current_task->task_id]; - if (p_task_information == nullptr) { + TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { continue; } - for (int activity_index = 0; activity_index < p_task_information->activity_count; activity_index++) { + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + // We are not interested in completed or hidden activities - if (current_task->activity[activity_index].activity_state != ActivityActive) { + if (client_activity->activity_state != ActivityActive) { continue; } - if (p_task_information->activity_information[activity_index].activity_type != ActivitySpeakWith) { + if (activity_info->activity_type != ActivitySpeakWith) { continue; } // Is there a zone restriction on the activity_information ? - if (!p_task_information->activity_information[activity_index].CheckZone(zone->GetZoneID())) { + if (!activity_info->CheckZone(zone->GetZoneID())) { continue; } + // Is the activity_information to speak with this type of NPC ? - if (p_task_information->activity_information[activity_index].goal_method == METHODQUEST && - p_task_information->activity_information[activity_index].goal_id == npc_type_id) { - return activity_index; + if (activity_info->goal_method == METHODQUEST && activity_info->goal_id == npc_type_id) { + return activity_id; } } return 0; @@ -1846,42 +1859,46 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t // Check if there are any active loot activities for this task - TaskInformation *Task = p_task_manager->p_task_data[current_task->task_id]; - - if (Task == nullptr) { + TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { return; } - for (int j = 0; j < Task->activity_count; j++) { + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + // We are not interested in completed or hidden activities - if (current_task->activity[j].activity_state != ActivityActive) { + if (client_activity->activity_state != ActivityActive) { continue; } // We are only interested in the ActivityType we were called with - if (Task->activity_information[j].activity_type != (int) activity_type) { + if (activity_info->activity_type != (int) activity_type) { continue; } // Is there a zone restriction on the activity_information ? - if (!Task->activity_information[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, + if (!activity_info->CheckZone(zone->GetZoneID())) { + Log( + Logs::General, Logs::Tasks, "[UPDATE] Char: %s activity_information type %i for Item %i failed zone check", client->GetName(), activity_type, - item_id); + item_id + ); continue; } // Is the activity_information related to this item ? // - switch (Task->activity_information[j].goal_method) { + switch (activity_info->goal_method) { case METHODSINGLEID: - if (Task->activity_information[j].goal_id != item_id) { continue; } + if (activity_info->goal_id != item_id) { continue; } break; case METHODLIST: if (!p_task_manager->goal_list_manager.IsInList( - Task->activity_information[j].goal_id, + activity_info->goal_id, item_id )) { continue; } break; @@ -1892,7 +1909,7 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t } // We found an active task related to this item, so increment the done count Log(Logs::General, Logs::Tasks, "[UPDATE] Calling increment done count ForItem"); - IncrementDoneCount(client, Task, current_task->slot, j, count); + IncrementDoneCount(client, p_task_data, current_task->slot, activity_id, count); } } } @@ -3367,28 +3384,28 @@ void TaskManager::SendActiveTaskDescription( return; } - int PacketLength = sizeof(TaskDescriptionHeader_Struct) + p_task_data[task_id]->title.length() + 1 - + sizeof(TaskDescriptionData1_Struct) + p_task_data[task_id]->description.length() + 1 - + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); + int packet_length = sizeof(TaskDescriptionHeader_Struct) + p_task_data[task_id]->title.length() + 1 + + sizeof(TaskDescriptionData1_Struct) + p_task_data[task_id]->description.length() + 1 + + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); // If there is an item make the reward text into a link to the item (only the first item if a list // is specified). I have been unable to get multiple item links to work. // if (p_task_data[task_id]->reward_id && p_task_data[task_id]->item_link.empty()) { - int ItemID = 0; + int item_id = 0; // If the reward is a list of items, and the first entry on the list is valid if (p_task_data[task_id]->reward_method == METHODSINGLEID) { - ItemID = p_task_data[task_id]->reward_id; + item_id = p_task_data[task_id]->reward_id; } else if (p_task_data[task_id]->reward_method == METHODLIST) { - ItemID = goal_list_manager.GetFirstEntry(p_task_data[task_id]->reward_id); - if (ItemID < 0) { - ItemID = 0; + item_id = goal_list_manager.GetFirstEntry(p_task_data[task_id]->reward_id); + if (item_id < 0) { + item_id = 0; } } - if (ItemID) { - const EQ::ItemData *reward_item = database.GetItem(ItemID); + if (item_id) { + const EQ::ItemData *reward_item = database.GetItem(item_id); EQ::SayLinkEngine linker; linker.SetLinkType(EQ::saylink::SayLinkItemData); @@ -3398,25 +3415,25 @@ void TaskManager::SendActiveTaskDescription( } } - PacketLength += p_task_data[task_id]->reward.length() + 1 + p_task_data[task_id]->item_link.length() + 1; + packet_length += p_task_data[task_id]->reward.length() + 1 + p_task_data[task_id]->item_link.length() + 1; char *Ptr; - TaskDescriptionHeader_Struct *tdh; + TaskDescriptionHeader_Struct *task_description_header; TaskDescriptionData1_Struct *tdd1; TaskDescriptionData2_Struct *tdd2; TaskDescriptionTrailer_Struct *tdt; - auto outapp = new EQApplicationPacket(OP_TaskDescription, PacketLength); + auto outapp = new EQApplicationPacket(OP_TaskDescription, packet_length); - tdh = (TaskDescriptionHeader_Struct *) outapp->pBuffer; + task_description_header = (TaskDescriptionHeader_Struct *) outapp->pBuffer; - tdh->SequenceNumber = task_info.slot; - tdh->TaskID = task_id; - tdh->open_window = bring_up_task_journal; - tdh->task_type = static_cast(p_task_data[task_id]->type); - tdh->reward_type = 0; // TODO: 4 says Radiant Crystals else Ebon Crystals when shared task + task_description_header->SequenceNumber = task_info.slot; + task_description_header->TaskID = task_id; + task_description_header->open_window = bring_up_task_journal; + task_description_header->task_type = static_cast(p_task_data[task_id]->type); + task_description_header->reward_type = 0; // TODO: 4 says Radiant Crystals else Ebon Crystals when shared task - Ptr = (char *) tdh + sizeof(TaskDescriptionHeader_Struct); + Ptr = (char *) task_description_header + sizeof(TaskDescriptionHeader_Struct); sprintf(Ptr, "%s", p_task_data[task_id]->title.c_str()); Ptr += p_task_data[task_id]->title.length() + 1; @@ -3530,20 +3547,20 @@ int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int task_id, int activit // TODO: shared tasks - int ActiveTaskIndex = -1; - for (int i = 0; i < MAXACTIVEQUESTS; i++) { + int active_task_index = -1; + for (int i = 0; i < MAXACTIVEQUESTS; i++) { if (active_quests[i].task_id == task_id) { - ActiveTaskIndex = i; + active_task_index = i; break; } } - if (ActiveTaskIndex == -1) { + if (active_task_index == -1) { return 0; } - if (active_quests[ActiveTaskIndex].activity[activity_id].done_count) { - return active_quests[ActiveTaskIndex].activity[activity_id].done_count; + if (active_quests[active_task_index].activity[activity_id].done_count) { + return active_quests[active_task_index].activity[activity_id].done_count; } else { return 0; From d83dc339fcdde80b1245d4978da6bcb9cf2c8db5 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 04:27:41 -0600 Subject: [PATCH 14/26] Logging cleanups --- zone/main.cpp | 1 - zone/tasks.cpp | 103 ++++++++++++++++++++++++++++--------------------- 2 files changed, 59 insertions(+), 45 deletions(-) diff --git a/zone/main.cpp b/zone/main.cpp index a89f25f9e..6cdd56735 100644 --- a/zone/main.cpp +++ b/zone/main.cpp @@ -426,7 +426,6 @@ int main(int argc, char** argv) { #endif if (RuleB(TaskSystem, EnableTaskSystem)) { - Log(Logs::General, Logs::Tasks, "[INIT] Loading Tasks"); p_task_manager = new TaskManager; p_task_manager->LoadTasks(); } diff --git a/zone/tasks.cpp b/zone/tasks.cpp index ee8043976..05f5294e1 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -113,7 +113,8 @@ bool TaskManager::LoadTasks(int single_task) } // load task level data - auto repo_tasks = TasksRepository::GetWhere(content_db, task_query_filter); + auto repo_tasks = TasksRepository::GetWhere(content_db, task_query_filter); + for (auto &task: repo_tasks) { int task_id = task.id; @@ -304,7 +305,7 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s int character_id = client->CharacterID(); - Log(Logs::Detail, Logs::Tasks, "TaskManager::SaveClientState for character ID %d", character_id); + LogTasks("[SaveClientState] character_id [{}]", character_id); if (client_task_state->active_task_count > 0 || client_task_state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks @@ -317,10 +318,12 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s int slot = active_task.slot; if (active_task.updated) { - Log(Logs::General, Logs::Tasks, - "[CLIENTSAVE] TaskManager::SaveClientState for character ID %d, Updating TaskIndex " - "%i task_id %i", - character_id, slot, task_id); + LogTasks( + "[SaveClientState] character_id [{}] updating task_index [{}] task_id [{}]", + character_id, + slot, + task_id + ); std::string query = StringFormat( "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime) " @@ -352,10 +355,13 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s continue; } - Log(Logs::General, Logs::Tasks, - "[CLIENTSAVE] TaskManager::SaveClientSate for character ID %d, Updating activity_information " - "%i, %i", - character_id, slot, activity_index); + LogTasks( + "[SaveClientState] Updating activity character_id [{}] updating task_index [{}] task_id [{}] activity_index [{}]", + character_id, + slot, + task_id, + activity_index + ); if (updated_activity_count == 0) { query += @@ -383,7 +389,6 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s continue; } - Log(Logs::General, Logs::Tasks, "[CLIENTSAVE] Executing query %s", query.c_str()); auto results = database.QueryDatabase(query); if (!results.Success()) { @@ -412,8 +417,6 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s task_index < client_task_state->completed_tasks.size(); task_index++) { - Log(Logs::General, Logs::Tasks, - "[CLIENTSAVE] TaskManager::SaveClientState Saving Completed Task at slot %i", task_index); int task_id = client_task_state->completed_tasks[task_index].task_id; if ((task_id <= 0) || (task_id >= MAXTASKS) || (p_task_data[task_id] == nullptr)) { @@ -634,7 +637,8 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s if (RuleB(TaskSystem, RecordCompletedTasks)) { CompletedTaskInformation completed_task_information{}; - for (bool &i : completed_task_information.activity_done) { + + for (bool &i : completed_task_information.activity_done) { i = false; } @@ -781,12 +785,12 @@ void ClientTaskState::EnableTask(int character_id, int task_count, int *task_lis for (int i = 0; i < task_count; i++) { auto iterator = enabled_tasks.begin(); - bool addTask = true; + bool add_task = true; while (iterator != enabled_tasks.end()) { // If this task is already enabled, stop looking if ((*iterator) == task_list[i]) { - addTask = false; + add_task = false; break; } // Our list of enabled tasks is sorted, so we can quit if we find a taskid higher than @@ -797,7 +801,7 @@ void ClientTaskState::EnableTask(int character_id, int task_count, int *task_lis ++iterator; } - if (addTask) { + if (add_task) { enabled_tasks.insert(iterator, task_list[i]); // Make a note of the task we enabled, for later SQL generation tasks_enabled.push_back(task_list[i]); @@ -881,14 +885,13 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li std::string query = queryStream.str(); if (tasks_disabled.size()) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Executing query %s", query.c_str()); database.QueryDatabase(query); } else { - Log(Logs::General, - Logs::Tasks, - "[UPDATE] DisableTask called for characterID: %u .. but, no tasks exist", - character_id); + LogTasks( + "[DisableTask] DisableTask called for characterID: [{}] ... but, no tasks exist", + character_id + ); } } @@ -1563,13 +1566,18 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & bool current_step_complete = true; - Log(Logs::General, Logs::Tasks, "[UPDATE] Current Step is %i, Last Step is %i", task_info.current_step, - p_task_information->last_step); + LogTasks( + "[UnlockActivities] Current step [{}] last_step [{}]", + task_info.current_step, + p_task_information->last_step + ); + // If current_step is -1, this is the first call to this method since loading the // client state. Unlock all activities with a step number of 0 if (task_info.current_step == -1) { for (int i = 0; i < p_task_information->activity_count; i++) { + if (p_task_information->activity_information[i].step_number == 0 && task_info.activity[i].activity_state == ActivityHidden) { task_info.activity[i].activity_state = ActivityActive; @@ -1579,11 +1587,11 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & task_info.current_step = 0; } - for (int Step = task_info.current_step; Step <= p_task_information->last_step; Step++) { - for (int Activity = 0; Activity < p_task_information->activity_count; Activity++) { - if (p_task_information->activity_information[Activity].step_number == (int) task_info.current_step) { - if ((task_info.activity[Activity].activity_state != ActivityCompleted) && - (!p_task_information->activity_information[Activity].optional)) { + for (int current_step = task_info.current_step; current_step <= p_task_information->last_step; current_step++) { + for (int activity = 0; activity < p_task_information->activity_count; activity++) { + if (p_task_information->activity_information[activity].step_number == (int) task_info.current_step) { + if ((task_info.activity[activity].activity_state != ActivityCompleted) && + (!p_task_information->activity_information[activity].optional)) { current_step_complete = false; all_activities_complete = false; break; @@ -1844,7 +1852,11 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t // If the client has no tasks, there is nothing further to check. - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksForItem(%d,%d)", activity_type, item_id); + LogTasks( + "[UpdateTasksForItem] activity_type [{}] item_id [{}]", + activity_type, + item_id + ); if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; @@ -1878,10 +1890,8 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t } // Is there a zone restriction on the activity_information ? if (!activity_info->CheckZone(zone->GetZoneID())) { - Log( - Logs::General, - Logs::Tasks, - "[UPDATE] Char: %s activity_information type %i for Item %i failed zone check", + LogTasks( + "[UpdateTasksForItem] Error: Character [{}] activity_information type [{}] for Item [{}] failed zone check", client->GetName(), activity_type, item_id @@ -1908,7 +1918,7 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t continue; } // We found an active task related to this item, so increment the done count - Log(Logs::General, Logs::Tasks, "[UPDATE] Calling increment done count ForItem"); + LogTasksDetail("[UpdateTasksForItem] Calling increment done count ForItem"); IncrementDoneCount(client, p_task_data, current_task->slot, activity_id, count); } } @@ -2426,7 +2436,12 @@ bool ClientTaskState::IsTaskActive(int task_id) void ClientTaskState::FailTask(Client *client, int task_id) { - Log(Logs::General, Logs::Tasks, "[UPDATE] FailTask %i, ActiveTaskCount is %i", task_id, active_task_count); + LogTasks( + "[FailTask] Failing task for character [{}] task_id [{}] task_count [{}]", + client->GetCleanName(), + task_id, + active_task_count + ); if (active_task.task_id == task_id) { client->SendTaskFailed(task_id, 0, TaskType::Task); @@ -2454,8 +2469,8 @@ void ClientTaskState::FailTask(Client *client, int task_id) // TODO: Shared tasks bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) { + LogTasks("[IsTaskActivityActive] task_id [{}] activity_id [{}]", task_id, activity_id); - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i).", task_id, activity_id); // Quick sanity check if (activity_id < 0) { return false; @@ -2504,12 +2519,12 @@ bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) return false; } - Log(Logs::General, - Logs::Tasks, - "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i). activity_state is %i ", + LogTasks( + "[IsTaskActivityActive] (Update) task_id [{}] activity_id [{}] activity_state", task_id, activity_id, - info->activity[activity_id].activity_state); + info->activity[activity_id].activity_state + ); return (info->activity[activity_id].activity_state == ActivityActive); } @@ -2773,12 +2788,12 @@ bool TaskManager::IsTaskRepeatable(int task_id) return false; } - TaskInformation *p_task_data = p_task_manager->p_task_data[task_id]; - if (p_task_data == nullptr) { + TaskInformation *task_data = p_task_manager->p_task_data[task_id]; + if (task_data == nullptr) { return false; } - return p_task_data->repeatable; + return task_data->repeatable; } bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) From ed9f155f7c244d30efd3b57a9754e9010bc3b8f4 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 04:37:16 -0600 Subject: [PATCH 15/26] More logging --- zone/tasks.cpp | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 05f5294e1..8910b7d87 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -3303,31 +3303,49 @@ void TaskManager::SendActiveTasksToClient(Client *client, bool task_complete) client, task_id, state->active_tasks[task_index], start_time, p_task_data[task_id]->duration, false ); - Log(Logs::General, Logs::Tasks, "[UPDATE] SendActiveTasksToClient: Task %i, Activities: %i", task_id, - GetActivityCount(task_id)); + LogTasks("[SendActiveTasksToClient] task_id [{}] activity_count [{}]", task_id, GetActivityCount(task_id)); int sequence = 0; int fixed_index = p_task_data[task_id]->type == TaskType::Task ? 0 : task_index - 1; // hmmm fuck for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { if (client->GetTaskActivityState(p_task_data[task_id]->type, fixed_index, activity_id) != ActivityHidden) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i, %i Complete=%i", task_id, - activity_id, fixed_index, task_complete); + LogTasks( + "[SendActiveTasksToClient] (Long Update) task_id [{}] activity_id [{}] fixed_index [{}] task_complete [{}]", + task_id, + activity_id, + fixed_index, + task_complete ? "true" : "false" + ); + if (activity_id == GetActivityCount(task_id) - 1) { SendTaskActivityLong( - client, task_id, activity_id, fixed_index, - p_task_data[task_id]->activity_information[activity_id].optional, task_complete + client, + task_id, + activity_id, + fixed_index, + p_task_data[task_id]->activity_information[activity_id].optional, + task_complete ); } else { SendTaskActivityLong( - client, task_id, activity_id, fixed_index, - p_task_data[task_id]->activity_information[activity_id].optional, 0 + client, + task_id, + activity_id, + fixed_index, + p_task_data[task_id]->activity_information[activity_id].optional, + 0 ); } } else { - Log(Logs::General, Logs::Tasks, "[UPDATE] Short: %i, %i, %i", task_id, activity_id, - fixed_index); + LogTasks( + "[SendActiveTasksToClient] (Short Update) task_id [{}] activity_id [{}] fixed_index [{}]", + task_id, + activity_id, + fixed_index + ); + SendTaskActivityShort(client, task_id, activity_id, fixed_index); } sequence++; @@ -4078,7 +4096,7 @@ int TaskProximityManager::CheckProximities(float x, float y, float z) Log( Logs::General, Logs::Tasks, - "[PROXIMITY] Checking %8.3f, %8.3f, %8.3f against %8.3f, %8.3f, %8.3f, %8.3f, %8.3f, %8.3f", + "[Proximity] Checking %8.3f, %8.3f, %8.3f against %8.3f, %8.3f, %8.3f, %8.3f, %8.3f, %8.3f", x, y, z, From b01793081a25a503e96ceda62b1a0df45d475dc8 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 17:38:11 -0600 Subject: [PATCH 16/26] More cleanup --- zone/client.h | 22 +++++++++++----------- zone/tasks.cpp | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/zone/client.h b/zone/client.h index 41b384cdc..0b92785f3 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1025,13 +1025,13 @@ public: void SendTaskFailed(int task_id, int task_index, TaskType task_type); void SendTaskComplete(int task_index); inline ClientTaskState *GetTaskState() const { return task_state; } - inline void CancelTask(int TaskIndex, TaskType type) + inline void CancelTask(int task_index, TaskType task_type) { if (task_state) { task_state->CancelTask( this, - TaskIndex, - type + task_index, + task_type ); } } @@ -1040,13 +1040,13 @@ public: return p_task_manager != nullptr && p_task_manager->SaveClientState(this, task_state); } inline bool IsTaskStateLoaded() { return task_state != nullptr; } - inline bool IsTaskActive(int TaskID) { return task_state != nullptr && task_state->IsTaskActive(TaskID); } - inline bool IsTaskActivityActive(int TaskID, int ActivityID) + inline bool IsTaskActive(int task_id) { return task_state != nullptr && task_state->IsTaskActive(task_id); } + inline bool IsTaskActivityActive(int task_id, int activity_id) { return task_state != nullptr && task_state->IsTaskActivityActive( - TaskID, - ActivityID + task_id, + activity_id ); } inline ActivityState GetTaskActivityState(TaskType task_type, int index, int activity_id) @@ -1179,14 +1179,14 @@ public: inline bool IsTaskEnabled(int task_id) { return task_state != nullptr && task_state->IsTaskEnabled(task_id); } - inline void ProcessTaskProximities(float X, float Y, float Z) + inline void ProcessTaskProximities(float x, float y, float z) { if (task_state) { task_state->ProcessTaskProximities( this, - X, - Y, - Z + x, + y, + z ); } } diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 8910b7d87..1faf636b0 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -4043,8 +4043,8 @@ bool TaskGoalListManager::IsInList(int list_id, int entry) return false; } - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i) returning true", list_index, - entry); + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i) returning true", list_index, entry); + return true; } From 55d4865d3650c88b7667ce89a39d121e5917b83b Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 18:16:39 -0600 Subject: [PATCH 17/26] Correct one missed repository pointer --- common/repositories/base/base_aa_ability_repository.h | 2 +- common/repositories/base/base_aa_rank_effects_repository.h | 2 +- common/repositories/base/base_aa_rank_prereqs_repository.h | 2 +- common/repositories/base/base_aa_ranks_repository.h | 2 +- common/repositories/base/base_account_flags_repository.h | 2 +- common/repositories/base/base_account_ip_repository.h | 2 +- common/repositories/base/base_account_repository.h | 2 +- common/repositories/base/base_account_rewards_repository.h | 2 +- common/repositories/base/base_adventure_details_repository.h | 2 +- common/repositories/base/base_adventure_members_repository.h | 2 +- common/repositories/base/base_adventure_stats_repository.h | 2 +- .../base/base_adventure_template_entry_flavor_repository.h | 2 +- .../base/base_adventure_template_entry_repository.h | 2 +- common/repositories/base/base_adventure_template_repository.h | 2 +- common/repositories/base/base_alternate_currency_repository.h | 2 +- common/repositories/base/base_auras_repository.h | 2 +- common/repositories/base/base_base_data_repository.h | 2 +- common/repositories/base/base_blocked_spells_repository.h | 2 +- common/repositories/base/base_bug_reports_repository.h | 2 +- common/repositories/base/base_bugs_repository.h | 2 +- common/repositories/base/base_buyer_repository.h | 2 +- .../base/base_char_create_combinations_repository.h | 2 +- .../base/base_char_create_point_allocations_repository.h | 2 +- common/repositories/base/base_char_recipe_list_repository.h | 2 +- common/repositories/base/base_character_activities_repository.h | 2 +- .../repositories/base/base_character_alt_currency_repository.h | 2 +- .../base/base_character_alternate_abilities_repository.h | 2 +- common/repositories/base/base_character_auras_repository.h | 2 +- common/repositories/base/base_character_bandolier_repository.h | 2 +- common/repositories/base/base_character_bind_repository.h | 2 +- common/repositories/base/base_character_buffs_repository.h | 2 +- .../repositories/base/base_character_corpse_items_repository.h | 2 +- common/repositories/base/base_character_corpses_repository.h | 2 +- common/repositories/base/base_character_currency_repository.h | 2 +- common/repositories/base/base_character_data_repository.h | 2 +- .../repositories/base/base_character_disciplines_repository.h | 2 +- .../base/base_character_expedition_lockouts_repository.h | 2 +- .../base/base_character_inspect_messages_repository.h | 2 +- .../repositories/base/base_character_item_recast_repository.h | 2 +- common/repositories/base/base_character_languages_repository.h | 2 +- .../base/base_character_leadership_abilities_repository.h | 2 +- common/repositories/base/base_character_material_repository.h | 2 +- .../repositories/base/base_character_memmed_spells_repository.h | 2 +- common/repositories/base/base_character_pet_buffs_repository.h | 2 +- common/repositories/base/base_character_pet_info_repository.h | 2 +- .../repositories/base/base_character_pet_inventory_repository.h | 2 +- common/repositories/base/base_character_potionbelt_repository.h | 2 +- common/repositories/base/base_character_skills_repository.h | 2 +- common/repositories/base/base_character_spells_repository.h | 2 +- common/repositories/base/base_character_tasks_repository.h | 2 +- common/repositories/base/base_completed_tasks_repository.h | 2 +- common/repositories/base/base_content_flags_repository.h | 2 +- common/repositories/base/base_damageshieldtypes_repository.h | 2 +- common/repositories/base/base_data_buckets_repository.h | 2 +- common/repositories/base/base_db_str_repository.h | 2 +- common/repositories/base/base_discovered_items_repository.h | 2 +- common/repositories/base/base_doors_repository.h | 2 +- common/repositories/base/base_dynamic_zones_repository.h | 2 +- common/repositories/base/base_eventlog_repository.h | 2 +- common/repositories/base/base_expedition_lockouts_repository.h | 2 +- common/repositories/base/base_expedition_members_repository.h | 2 +- common/repositories/base/base_expeditions_repository.h | 2 +- common/repositories/base/base_faction_base_data_repository.h | 2 +- common/repositories/base/base_faction_list_mod_repository.h | 2 +- common/repositories/base/base_faction_list_repository.h | 2 +- common/repositories/base/base_faction_values_repository.h | 2 +- common/repositories/base/base_fishing_repository.h | 2 +- common/repositories/base/base_forage_repository.h | 2 +- common/repositories/base/base_friends_repository.h | 2 +- common/repositories/base/base_global_loot_repository.h | 2 +- common/repositories/base/base_gm_ips_repository.h | 2 +- common/repositories/base/base_goallists_repository.h | 2 +- common/repositories/base/base_graveyard_repository.h | 2 +- common/repositories/base/base_ground_spawns_repository.h | 2 +- common/repositories/base/base_group_id_repository.h | 2 +- common/repositories/base/base_group_leaders_repository.h | 2 +- common/repositories/base/base_guild_members_repository.h | 2 +- common/repositories/base/base_guild_ranks_repository.h | 2 +- common/repositories/base/base_guild_relations_repository.h | 2 +- common/repositories/base/base_guilds_repository.h | 2 +- common/repositories/base/base_hackers_repository.h | 2 +- common/repositories/base/base_instance_list_player_repository.h | 2 +- common/repositories/base/base_instance_list_repository.h | 2 +- common/repositories/base/base_inventory_repository.h | 2 +- common/repositories/base/base_inventory_snapshots_repository.h | 2 +- common/repositories/base/base_ip_exemptions_repository.h | 2 +- common/repositories/base/base_item_tick_repository.h | 2 +- common/repositories/base/base_items_repository.h | 2 +- common/repositories/base/base_ldon_trap_entries_repository.h | 2 +- common/repositories/base/base_ldon_trap_templates_repository.h | 2 +- common/repositories/base/base_level_exp_mods_repository.h | 2 +- common/repositories/base/base_lfguild_repository.h | 2 +- common/repositories/base/base_login_accounts_repository.h | 2 +- common/repositories/base/base_login_api_tokens_repository.h | 2 +- common/repositories/base/base_login_server_admins_repository.h | 2 +- .../repositories/base/base_login_server_list_types_repository.h | 2 +- common/repositories/base/base_login_world_servers_repository.h | 2 +- common/repositories/base/base_logsys_categories_repository.h | 2 +- common/repositories/base/base_lootdrop_entries_repository.h | 2 +- common/repositories/base/base_lootdrop_repository.h | 2 +- common/repositories/base/base_loottable_entries_repository.h | 2 +- common/repositories/base/base_loottable_repository.h | 2 +- common/repositories/base/base_mail_repository.h | 2 +- common/repositories/base/base_merchantlist_repository.h | 2 +- common/repositories/base/base_merchantlist_temp_repository.h | 2 +- common/repositories/base/base_name_filter_repository.h | 2 +- common/repositories/base/base_npc_emotes_repository.h | 2 +- common/repositories/base/base_npc_faction_entries_repository.h | 2 +- common/repositories/base/base_npc_faction_repository.h | 2 +- .../repositories/base/base_npc_scale_global_base_repository.h | 2 +- .../base/base_npc_spells_effects_entries_repository.h | 2 +- common/repositories/base/base_npc_spells_effects_repository.h | 2 +- common/repositories/base/base_npc_spells_entries_repository.h | 2 +- common/repositories/base/base_npc_spells_repository.h | 2 +- common/repositories/base/base_npc_types_repository.h | 2 +- common/repositories/base/base_npc_types_tint_repository.h | 2 +- common/repositories/base/base_object_contents_repository.h | 2 +- common/repositories/base/base_object_repository.h | 2 +- .../base/base_perl_event_export_settings_repository.h | 2 +- common/repositories/base/base_petitions_repository.h | 2 +- .../base/base_pets_equipmentset_entries_repository.h | 2 +- common/repositories/base/base_pets_equipmentset_repository.h | 2 +- common/repositories/base/base_pets_repository.h | 2 +- common/repositories/base/base_player_titlesets_repository.h | 2 +- common/repositories/base/base_proximities_repository.h | 2 +- common/repositories/base/base_quest_globals_repository.h | 2 +- common/repositories/base/base_raid_details_repository.h | 2 +- common/repositories/base/base_raid_members_repository.h | 2 +- common/repositories/base/base_reports_repository.h | 2 +- common/repositories/base/base_respawn_times_repository.h | 2 +- common/repositories/base/base_rule_sets_repository.h | 2 +- common/repositories/base/base_rule_values_repository.h | 2 +- common/repositories/base/base_saylink_repository.h | 2 +- common/repositories/base/base_skill_caps_repository.h | 2 +- common/repositories/base/base_spawn2_repository.h | 2 +- .../repositories/base/base_spawn_condition_values_repository.h | 2 +- common/repositories/base/base_spawn_conditions_repository.h | 2 +- common/repositories/base/base_spawn_events_repository.h | 2 +- common/repositories/base/base_spawnentry_repository.h | 2 +- common/repositories/base/base_spawngroup_repository.h | 2 +- common/repositories/base/base_spell_buckets_repository.h | 2 +- common/repositories/base/base_spell_globals_repository.h | 2 +- common/repositories/base/base_spells_new_repository.h | 2 +- common/repositories/base/base_start_zones_repository.h | 2 +- common/repositories/base/base_starting_items_repository.h | 2 +- common/repositories/base/base_task_activities_repository.h | 2 +- common/repositories/base/base_tasks_repository.h | 2 +- common/repositories/base/base_tasksets_repository.h | 2 +- common/repositories/base/base_timers_repository.h | 2 +- common/repositories/base/base_titles_repository.h | 2 +- common/repositories/base/base_trader_repository.h | 2 +- .../base/base_tradeskill_recipe_entries_repository.h | 2 +- common/repositories/base/base_tradeskill_recipe_repository.h | 2 +- common/repositories/base/base_traps_repository.h | 2 +- common/repositories/base/base_tribute_levels_repository.h | 2 +- common/repositories/base/base_tributes_repository.h | 2 +- .../base/base_veteran_reward_templates_repository.h | 2 +- common/repositories/base/base_zone_points_repository.h | 2 +- common/repositories/base/base_zone_repository.h | 2 +- common/repositories/template/base_repository.template | 2 +- 160 files changed, 160 insertions(+), 160 deletions(-) diff --git a/common/repositories/base/base_aa_ability_repository.h b/common/repositories/base/base_aa_ability_repository.h index 965d8d9b9..f687604b1 100644 --- a/common/repositories/base/base_aa_ability_repository.h +++ b/common/repositories/base/base_aa_ability_repository.h @@ -269,7 +269,7 @@ public: insert_values.push_back(std::to_string(aa_ability_entry.enabled)); insert_values.push_back(std::to_string(aa_ability_entry.reset_on_death)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_aa_rank_effects_repository.h b/common/repositories/base/base_aa_rank_effects_repository.h index 3d8341f3b..4bed89085 100644 --- a/common/repositories/base/base_aa_rank_effects_repository.h +++ b/common/repositories/base/base_aa_rank_effects_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back(std::to_string(aa_rank_effects_entry.base1)); insert_values.push_back(std::to_string(aa_rank_effects_entry.base2)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_aa_rank_prereqs_repository.h b/common/repositories/base/base_aa_rank_prereqs_repository.h index ca1441e21..5bd751938 100644 --- a/common/repositories/base/base_aa_rank_prereqs_repository.h +++ b/common/repositories/base/base_aa_rank_prereqs_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(aa_rank_prereqs_entry.aa_id)); insert_values.push_back(std::to_string(aa_rank_prereqs_entry.points)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_aa_ranks_repository.h b/common/repositories/base/base_aa_ranks_repository.h index 6f986c14d..87af9d210 100644 --- a/common/repositories/base/base_aa_ranks_repository.h +++ b/common/repositories/base/base_aa_ranks_repository.h @@ -263,7 +263,7 @@ public: insert_values.push_back(std::to_string(aa_ranks_entry.prev_id)); insert_values.push_back(std::to_string(aa_ranks_entry.next_id)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_account_flags_repository.h b/common/repositories/base/base_account_flags_repository.h index 7c9dda34e..17c135219 100644 --- a/common/repositories/base/base_account_flags_repository.h +++ b/common/repositories/base/base_account_flags_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back("'" + EscapeString(account_flags_entry.p_flag) + "'"); insert_values.push_back("'" + EscapeString(account_flags_entry.p_value) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_account_ip_repository.h b/common/repositories/base/base_account_ip_repository.h index 393f03e69..757e72ef6 100644 --- a/common/repositories/base/base_account_ip_repository.h +++ b/common/repositories/base/base_account_ip_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(account_ip_entry.count)); insert_values.push_back("'" + EscapeString(account_ip_entry.lastused) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_account_repository.h b/common/repositories/base/base_account_repository.h index 205a70ec1..b33310800 100644 --- a/common/repositories/base/base_account_repository.h +++ b/common/repositories/base/base_account_repository.h @@ -297,7 +297,7 @@ public: insert_values.push_back("'" + EscapeString(account_entry.ban_reason) + "'"); insert_values.push_back("'" + EscapeString(account_entry.suspend_reason) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_account_rewards_repository.h b/common/repositories/base/base_account_rewards_repository.h index 5ec33e1b7..e08eba9ad 100644 --- a/common/repositories/base/base_account_rewards_repository.h +++ b/common/repositories/base/base_account_rewards_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(account_rewards_entry.reward_id)); insert_values.push_back(std::to_string(account_rewards_entry.amount)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_adventure_details_repository.h b/common/repositories/base/base_adventure_details_repository.h index 5ee6e3d7e..afdaf82ab 100644 --- a/common/repositories/base/base_adventure_details_repository.h +++ b/common/repositories/base/base_adventure_details_repository.h @@ -237,7 +237,7 @@ public: insert_values.push_back(std::to_string(adventure_details_entry.time_zoned)); insert_values.push_back(std::to_string(adventure_details_entry.time_completed)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_adventure_members_repository.h b/common/repositories/base/base_adventure_members_repository.h index 4b6fcf2fc..1a2f5c15d 100644 --- a/common/repositories/base/base_adventure_members_repository.h +++ b/common/repositories/base/base_adventure_members_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(adventure_members_entry.id)); insert_values.push_back(std::to_string(adventure_members_entry.charid)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_adventure_stats_repository.h b/common/repositories/base/base_adventure_stats_repository.h index 56008e648..62c3deaf5 100644 --- a/common/repositories/base/base_adventure_stats_repository.h +++ b/common/repositories/base/base_adventure_stats_repository.h @@ -251,7 +251,7 @@ public: insert_values.push_back(std::to_string(adventure_stats_entry.ruj_losses)); insert_values.push_back(std::to_string(adventure_stats_entry.tak_losses)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_adventure_template_entry_flavor_repository.h b/common/repositories/base/base_adventure_template_entry_flavor_repository.h index ff3a3c636..7950ae1cf 100644 --- a/common/repositories/base/base_adventure_template_entry_flavor_repository.h +++ b/common/repositories/base/base_adventure_template_entry_flavor_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(adventure_template_entry_flavor_entry.id)); insert_values.push_back("'" + EscapeString(adventure_template_entry_flavor_entry.text) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_adventure_template_entry_repository.h b/common/repositories/base/base_adventure_template_entry_repository.h index cf86781ac..dae7e3f9e 100644 --- a/common/repositories/base/base_adventure_template_entry_repository.h +++ b/common/repositories/base/base_adventure_template_entry_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(adventure_template_entry_entry.id)); insert_values.push_back(std::to_string(adventure_template_entry_entry.template_id)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_adventure_template_repository.h b/common/repositories/base/base_adventure_template_repository.h index 6857bda5a..aa1de97b5 100644 --- a/common/repositories/base/base_adventure_template_repository.h +++ b/common/repositories/base/base_adventure_template_repository.h @@ -383,7 +383,7 @@ public: insert_values.push_back(std::to_string(adventure_template_entry.graveyard_z)); insert_values.push_back(std::to_string(adventure_template_entry.graveyard_radius)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_alternate_currency_repository.h b/common/repositories/base/base_alternate_currency_repository.h index 722c90750..8b918690e 100644 --- a/common/repositories/base/base_alternate_currency_repository.h +++ b/common/repositories/base/base_alternate_currency_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(alternate_currency_entry.id)); insert_values.push_back(std::to_string(alternate_currency_entry.item_id)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_auras_repository.h b/common/repositories/base/base_auras_repository.h index 859391361..b500b3e81 100644 --- a/common/repositories/base/base_auras_repository.h +++ b/common/repositories/base/base_auras_repository.h @@ -251,7 +251,7 @@ public: insert_values.push_back(std::to_string(auras_entry.icon)); insert_values.push_back(std::to_string(auras_entry.cast_time)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_base_data_repository.h b/common/repositories/base/base_base_data_repository.h index 6178cb9d4..e4a6aa8dc 100644 --- a/common/repositories/base/base_base_data_repository.h +++ b/common/repositories/base/base_base_data_repository.h @@ -245,7 +245,7 @@ public: insert_values.push_back(std::to_string(base_data_entry.mana_fac)); insert_values.push_back(std::to_string(base_data_entry.end_fac)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_blocked_spells_repository.h b/common/repositories/base/base_blocked_spells_repository.h index c47cf6cd2..a6f58bbb0 100644 --- a/common/repositories/base/base_blocked_spells_repository.h +++ b/common/repositories/base/base_blocked_spells_repository.h @@ -255,7 +255,7 @@ public: insert_values.push_back("'" + EscapeString(blocked_spells_entry.message) + "'"); insert_values.push_back("'" + EscapeString(blocked_spells_entry.description) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_bug_reports_repository.h b/common/repositories/base/base_bug_reports_repository.h index 5feea96d8..9e3cea3d2 100644 --- a/common/repositories/base/base_bug_reports_repository.h +++ b/common/repositories/base/base_bug_reports_repository.h @@ -375,7 +375,7 @@ public: insert_values.push_back("'" + EscapeString(bug_reports_entry.last_reviewer) + "'"); insert_values.push_back("'" + EscapeString(bug_reports_entry.reviewer_notes) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_bugs_repository.h b/common/repositories/base/base_bugs_repository.h index 79e193a7a..a6072991a 100644 --- a/common/repositories/base/base_bugs_repository.h +++ b/common/repositories/base/base_bugs_repository.h @@ -261,7 +261,7 @@ public: insert_values.push_back("'" + EscapeString(bugs_entry.date) + "'"); insert_values.push_back(std::to_string(bugs_entry.status)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_buyer_repository.h b/common/repositories/base/base_buyer_repository.h index 39148dac3..a0898fefd 100644 --- a/common/repositories/base/base_buyer_repository.h +++ b/common/repositories/base/base_buyer_repository.h @@ -221,7 +221,7 @@ public: insert_values.push_back(std::to_string(buyer_entry.quantity)); insert_values.push_back(std::to_string(buyer_entry.price)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_char_create_combinations_repository.h b/common/repositories/base/base_char_create_combinations_repository.h index 8f2d8ddb2..68c806a54 100644 --- a/common/repositories/base/base_char_create_combinations_repository.h +++ b/common/repositories/base/base_char_create_combinations_repository.h @@ -221,7 +221,7 @@ public: insert_values.push_back(std::to_string(char_create_combinations_entry.start_zone)); insert_values.push_back(std::to_string(char_create_combinations_entry.expansions_req)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_char_create_point_allocations_repository.h b/common/repositories/base/base_char_create_point_allocations_repository.h index 600e41e5d..04148a2d9 100644 --- a/common/repositories/base/base_char_create_point_allocations_repository.h +++ b/common/repositories/base/base_char_create_point_allocations_repository.h @@ -275,7 +275,7 @@ public: insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_wis)); insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_cha)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_char_recipe_list_repository.h b/common/repositories/base/base_char_recipe_list_repository.h index 979d7f18b..0041a3032 100644 --- a/common/repositories/base/base_char_recipe_list_repository.h +++ b/common/repositories/base/base_char_recipe_list_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(char_recipe_list_entry.recipe_id)); insert_values.push_back(std::to_string(char_recipe_list_entry.madecount)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_activities_repository.h b/common/repositories/base/base_character_activities_repository.h index 7f3d05dae..3669d303b 100644 --- a/common/repositories/base/base_character_activities_repository.h +++ b/common/repositories/base/base_character_activities_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back(std::to_string(character_activities_entry.donecount)); insert_values.push_back(std::to_string(character_activities_entry.completed)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_alt_currency_repository.h b/common/repositories/base/base_character_alt_currency_repository.h index 300db63f4..7b97ebade 100644 --- a/common/repositories/base/base_character_alt_currency_repository.h +++ b/common/repositories/base/base_character_alt_currency_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(character_alt_currency_entry.currency_id)); insert_values.push_back(std::to_string(character_alt_currency_entry.amount)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_alternate_abilities_repository.h b/common/repositories/base/base_character_alternate_abilities_repository.h index 98171a33c..3adc61c53 100644 --- a/common/repositories/base/base_character_alternate_abilities_repository.h +++ b/common/repositories/base/base_character_alternate_abilities_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(character_alternate_abilities_entry.aa_value)); insert_values.push_back(std::to_string(character_alternate_abilities_entry.charges)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_auras_repository.h b/common/repositories/base/base_character_auras_repository.h index cc9fdedce..cef91dc07 100644 --- a/common/repositories/base/base_character_auras_repository.h +++ b/common/repositories/base/base_character_auras_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(character_auras_entry.slot)); insert_values.push_back(std::to_string(character_auras_entry.spell_id)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_bandolier_repository.h b/common/repositories/base/base_character_bandolier_repository.h index 3d58d17c7..be2c861d3 100644 --- a/common/repositories/base/base_character_bandolier_repository.h +++ b/common/repositories/base/base_character_bandolier_repository.h @@ -221,7 +221,7 @@ public: insert_values.push_back(std::to_string(character_bandolier_entry.icon)); insert_values.push_back("'" + EscapeString(character_bandolier_entry.bandolier_name) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_bind_repository.h b/common/repositories/base/base_character_bind_repository.h index e5920c4e1..ba9498781 100644 --- a/common/repositories/base/base_character_bind_repository.h +++ b/common/repositories/base/base_character_bind_repository.h @@ -231,7 +231,7 @@ public: insert_values.push_back(std::to_string(character_bind_entry.z)); insert_values.push_back(std::to_string(character_bind_entry.heading)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_buffs_repository.h b/common/repositories/base/base_character_buffs_repository.h index 9c8b53f42..77289fded 100644 --- a/common/repositories/base/base_character_buffs_repository.h +++ b/common/repositories/base/base_character_buffs_repository.h @@ -287,7 +287,7 @@ public: insert_values.push_back(std::to_string(character_buffs_entry.ExtraDIChance)); insert_values.push_back(std::to_string(character_buffs_entry.instrument_mod)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_corpse_items_repository.h b/common/repositories/base/base_character_corpse_items_repository.h index aa999c62f..9328d1aa0 100644 --- a/common/repositories/base/base_character_corpse_items_repository.h +++ b/common/repositories/base/base_character_corpse_items_repository.h @@ -251,7 +251,7 @@ public: insert_values.push_back(std::to_string(character_corpse_items_entry.aug_6)); insert_values.push_back(std::to_string(character_corpse_items_entry.attuned)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_corpses_repository.h b/common/repositories/base/base_character_corpses_repository.h index 4e0ee17f2..10379d109 100644 --- a/common/repositories/base/base_character_corpses_repository.h +++ b/common/repositories/base/base_character_corpses_repository.h @@ -465,7 +465,7 @@ public: insert_values.push_back(std::to_string(character_corpses_entry.wc_8)); insert_values.push_back(std::to_string(character_corpses_entry.wc_9)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_currency_repository.h b/common/repositories/base/base_character_currency_repository.h index 8eeb70244..462fba848 100644 --- a/common/repositories/base/base_character_currency_repository.h +++ b/common/repositories/base/base_character_currency_repository.h @@ -287,7 +287,7 @@ public: insert_values.push_back(std::to_string(character_currency_entry.ebon_crystals)); insert_values.push_back(std::to_string(character_currency_entry.career_ebon_crystals)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_data_repository.h b/common/repositories/base/base_character_data_repository.h index c76399ab4..ff06fa11b 100644 --- a/common/repositories/base/base_character_data_repository.h +++ b/common/repositories/base/base_character_data_repository.h @@ -795,7 +795,7 @@ public: insert_values.push_back(std::to_string(character_data_entry.e_last_invsnapshot)); insert_values.push_back("'" + EscapeString(character_data_entry.deleted_at) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_disciplines_repository.h b/common/repositories/base/base_character_disciplines_repository.h index a61dfbf6d..0a10e7288 100644 --- a/common/repositories/base/base_character_disciplines_repository.h +++ b/common/repositories/base/base_character_disciplines_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(character_disciplines_entry.slot_id)); insert_values.push_back(std::to_string(character_disciplines_entry.disc_id)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_expedition_lockouts_repository.h b/common/repositories/base/base_character_expedition_lockouts_repository.h index 492727298..705dacf10 100644 --- a/common/repositories/base/base_character_expedition_lockouts_repository.h +++ b/common/repositories/base/base_character_expedition_lockouts_repository.h @@ -225,7 +225,7 @@ public: insert_values.push_back(std::to_string(character_expedition_lockouts_entry.duration)); insert_values.push_back("'" + EscapeString(character_expedition_lockouts_entry.from_expedition_uuid) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_inspect_messages_repository.h b/common/repositories/base/base_character_inspect_messages_repository.h index e3088ded3..d5978defc 100644 --- a/common/repositories/base/base_character_inspect_messages_repository.h +++ b/common/repositories/base/base_character_inspect_messages_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(character_inspect_messages_entry.id)); insert_values.push_back("'" + EscapeString(character_inspect_messages_entry.inspect_message) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_item_recast_repository.h b/common/repositories/base/base_character_item_recast_repository.h index 224380ac4..d86f795df 100644 --- a/common/repositories/base/base_character_item_recast_repository.h +++ b/common/repositories/base/base_character_item_recast_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(character_item_recast_entry.recast_type)); insert_values.push_back(std::to_string(character_item_recast_entry.timestamp)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_languages_repository.h b/common/repositories/base/base_character_languages_repository.h index 9a1519124..4c0bc6ac9 100644 --- a/common/repositories/base/base_character_languages_repository.h +++ b/common/repositories/base/base_character_languages_repository.h @@ -201,7 +201,7 @@ public: insert_values.push_back(std::to_string(character_languages_entry.lang_id)); insert_values.push_back(std::to_string(character_languages_entry.value)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_leadership_abilities_repository.h b/common/repositories/base/base_character_leadership_abilities_repository.h index ad340b07e..5482523a2 100644 --- a/common/repositories/base/base_character_leadership_abilities_repository.h +++ b/common/repositories/base/base_character_leadership_abilities_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(character_leadership_abilities_entry.slot)); insert_values.push_back(std::to_string(character_leadership_abilities_entry.rank)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_material_repository.h b/common/repositories/base/base_character_material_repository.h index 1fa174fe3..958c2d237 100644 --- a/common/repositories/base/base_character_material_repository.h +++ b/common/repositories/base/base_character_material_repository.h @@ -225,7 +225,7 @@ public: insert_values.push_back(std::to_string(character_material_entry.use_tint)); insert_values.push_back(std::to_string(character_material_entry.color)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_memmed_spells_repository.h b/common/repositories/base/base_character_memmed_spells_repository.h index ae080ccb5..33b789392 100644 --- a/common/repositories/base/base_character_memmed_spells_repository.h +++ b/common/repositories/base/base_character_memmed_spells_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(character_memmed_spells_entry.slot_id)); insert_values.push_back(std::to_string(character_memmed_spells_entry.spell_id)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_pet_buffs_repository.h b/common/repositories/base/base_character_pet_buffs_repository.h index 55206de76..4801262b2 100644 --- a/common/repositories/base/base_character_pet_buffs_repository.h +++ b/common/repositories/base/base_character_pet_buffs_repository.h @@ -251,7 +251,7 @@ public: insert_values.push_back(std::to_string(character_pet_buffs_entry.rune)); insert_values.push_back(std::to_string(character_pet_buffs_entry.instrument_mod)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_pet_info_repository.h b/common/repositories/base/base_character_pet_info_repository.h index 7d6685ce3..3d1c1c977 100644 --- a/common/repositories/base/base_character_pet_info_repository.h +++ b/common/repositories/base/base_character_pet_info_repository.h @@ -239,7 +239,7 @@ public: insert_values.push_back(std::to_string(character_pet_info_entry.size)); insert_values.push_back(std::to_string(character_pet_info_entry.taunting)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_pet_inventory_repository.h b/common/repositories/base/base_character_pet_inventory_repository.h index cff42805b..cb561d959 100644 --- a/common/repositories/base/base_character_pet_inventory_repository.h +++ b/common/repositories/base/base_character_pet_inventory_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(character_pet_inventory_entry.slot)); insert_values.push_back(std::to_string(character_pet_inventory_entry.item_id)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_potionbelt_repository.h b/common/repositories/base/base_character_potionbelt_repository.h index 32d30b0b4..1fce31537 100644 --- a/common/repositories/base/base_character_potionbelt_repository.h +++ b/common/repositories/base/base_character_potionbelt_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(character_potionbelt_entry.item_id)); insert_values.push_back(std::to_string(character_potionbelt_entry.icon)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_skills_repository.h b/common/repositories/base/base_character_skills_repository.h index f18a8b8a5..0b74eb410 100644 --- a/common/repositories/base/base_character_skills_repository.h +++ b/common/repositories/base/base_character_skills_repository.h @@ -201,7 +201,7 @@ public: insert_values.push_back(std::to_string(character_skills_entry.skill_id)); insert_values.push_back(std::to_string(character_skills_entry.value)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_spells_repository.h b/common/repositories/base/base_character_spells_repository.h index 76c811b34..13e007855 100644 --- a/common/repositories/base/base_character_spells_repository.h +++ b/common/repositories/base/base_character_spells_repository.h @@ -201,7 +201,7 @@ public: insert_values.push_back(std::to_string(character_spells_entry.slot_id)); insert_values.push_back(std::to_string(character_spells_entry.spell_id)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_character_tasks_repository.h b/common/repositories/base/base_character_tasks_repository.h index ddf9360ab..f7fa167db 100644 --- a/common/repositories/base/base_character_tasks_repository.h +++ b/common/repositories/base/base_character_tasks_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back(std::to_string(character_tasks_entry.type)); insert_values.push_back(std::to_string(character_tasks_entry.acceptedtime)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_completed_tasks_repository.h b/common/repositories/base/base_completed_tasks_repository.h index 2324dc5ea..023847085 100644 --- a/common/repositories/base/base_completed_tasks_repository.h +++ b/common/repositories/base/base_completed_tasks_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(completed_tasks_entry.taskid)); insert_values.push_back(std::to_string(completed_tasks_entry.activityid)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_content_flags_repository.h b/common/repositories/base/base_content_flags_repository.h index 76e25e7f2..d9b1e74d4 100644 --- a/common/repositories/base/base_content_flags_repository.h +++ b/common/repositories/base/base_content_flags_repository.h @@ -207,7 +207,7 @@ public: insert_values.push_back(std::to_string(content_flags_entry.enabled)); insert_values.push_back("'" + EscapeString(content_flags_entry.notes) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_damageshieldtypes_repository.h b/common/repositories/base/base_damageshieldtypes_repository.h index ae932940b..c16e4d18c 100644 --- a/common/repositories/base/base_damageshieldtypes_repository.h +++ b/common/repositories/base/base_damageshieldtypes_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(damageshieldtypes_entry.spellid)); insert_values.push_back(std::to_string(damageshieldtypes_entry.type)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_data_buckets_repository.h b/common/repositories/base/base_data_buckets_repository.h index 622af41b9..91138da9a 100644 --- a/common/repositories/base/base_data_buckets_repository.h +++ b/common/repositories/base/base_data_buckets_repository.h @@ -207,7 +207,7 @@ public: insert_values.push_back("'" + EscapeString(data_buckets_entry.value) + "'"); insert_values.push_back(std::to_string(data_buckets_entry.expires)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_db_str_repository.h b/common/repositories/base/base_db_str_repository.h index bda720ec8..036950948 100644 --- a/common/repositories/base/base_db_str_repository.h +++ b/common/repositories/base/base_db_str_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(db_str_entry.type)); insert_values.push_back("'" + EscapeString(db_str_entry.value) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_discovered_items_repository.h b/common/repositories/base/base_discovered_items_repository.h index f91d4e11c..08ecba827 100644 --- a/common/repositories/base/base_discovered_items_repository.h +++ b/common/repositories/base/base_discovered_items_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(discovered_items_entry.discovered_date)); insert_values.push_back(std::to_string(discovered_items_entry.account_status)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_doors_repository.h b/common/repositories/base/base_doors_repository.h index cb746503d..ca554749f 100644 --- a/common/repositories/base/base_doors_repository.h +++ b/common/repositories/base/base_doors_repository.h @@ -393,7 +393,7 @@ public: insert_values.push_back("'" + EscapeString(doors_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(doors_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_dynamic_zones_repository.h b/common/repositories/base/base_dynamic_zones_repository.h index faab30727..6a930330b 100644 --- a/common/repositories/base/base_dynamic_zones_repository.h +++ b/common/repositories/base/base_dynamic_zones_repository.h @@ -285,7 +285,7 @@ public: insert_values.push_back(std::to_string(dynamic_zones_entry.zone_in_heading)); insert_values.push_back(std::to_string(dynamic_zones_entry.has_zone_in)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_eventlog_repository.h b/common/repositories/base/base_eventlog_repository.h index c72ad0d1c..5c134adaf 100644 --- a/common/repositories/base/base_eventlog_repository.h +++ b/common/repositories/base/base_eventlog_repository.h @@ -243,7 +243,7 @@ public: insert_values.push_back("'" + EscapeString(eventlog_entry.description) + "'"); insert_values.push_back(std::to_string(eventlog_entry.event_nid)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_expedition_lockouts_repository.h b/common/repositories/base/base_expedition_lockouts_repository.h index 20f92f80c..96ef8677a 100644 --- a/common/repositories/base/base_expedition_lockouts_repository.h +++ b/common/repositories/base/base_expedition_lockouts_repository.h @@ -219,7 +219,7 @@ public: insert_values.push_back(std::to_string(expedition_lockouts_entry.duration)); insert_values.push_back("'" + EscapeString(expedition_lockouts_entry.from_expedition_uuid) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_expedition_members_repository.h b/common/repositories/base/base_expedition_members_repository.h index 36778acb0..a5628a3d7 100644 --- a/common/repositories/base/base_expedition_members_repository.h +++ b/common/repositories/base/base_expedition_members_repository.h @@ -207,7 +207,7 @@ public: insert_values.push_back(std::to_string(expedition_members_entry.character_id)); insert_values.push_back(std::to_string(expedition_members_entry.is_current_member)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_expeditions_repository.h b/common/repositories/base/base_expeditions_repository.h index 330428b41..5eaadb9a6 100644 --- a/common/repositories/base/base_expeditions_repository.h +++ b/common/repositories/base/base_expeditions_repository.h @@ -237,7 +237,7 @@ public: insert_values.push_back(std::to_string(expeditions_entry.add_replay_on_join)); insert_values.push_back(std::to_string(expeditions_entry.is_locked)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_faction_base_data_repository.h b/common/repositories/base/base_faction_base_data_repository.h index 09aa8f413..faa099dfd 100644 --- a/common/repositories/base/base_faction_base_data_repository.h +++ b/common/repositories/base/base_faction_base_data_repository.h @@ -221,7 +221,7 @@ public: insert_values.push_back(std::to_string(faction_base_data_entry.unk_hero2)); insert_values.push_back(std::to_string(faction_base_data_entry.unk_hero3)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_faction_list_mod_repository.h b/common/repositories/base/base_faction_list_mod_repository.h index 9c91ebee9..136de8703 100644 --- a/common/repositories/base/base_faction_list_mod_repository.h +++ b/common/repositories/base/base_faction_list_mod_repository.h @@ -207,7 +207,7 @@ public: insert_values.push_back(std::to_string(faction_list_mod_entry.mod)); insert_values.push_back("'" + EscapeString(faction_list_mod_entry.mod_name) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_faction_list_repository.h b/common/repositories/base/base_faction_list_repository.h index 08b4ae16a..870f6335f 100644 --- a/common/repositories/base/base_faction_list_repository.h +++ b/common/repositories/base/base_faction_list_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back("'" + EscapeString(faction_list_entry.name) + "'"); insert_values.push_back(std::to_string(faction_list_entry.base)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_faction_values_repository.h b/common/repositories/base/base_faction_values_repository.h index 999c01806..63fbd2597 100644 --- a/common/repositories/base/base_faction_values_repository.h +++ b/common/repositories/base/base_faction_values_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(faction_values_entry.current_value)); insert_values.push_back(std::to_string(faction_values_entry.temp)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_fishing_repository.h b/common/repositories/base/base_fishing_repository.h index 73515df6e..8ba5d7517 100644 --- a/common/repositories/base/base_fishing_repository.h +++ b/common/repositories/base/base_fishing_repository.h @@ -249,7 +249,7 @@ public: insert_values.push_back("'" + EscapeString(fishing_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(fishing_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_forage_repository.h b/common/repositories/base/base_forage_repository.h index f279f1532..6fda9ba2d 100644 --- a/common/repositories/base/base_forage_repository.h +++ b/common/repositories/base/base_forage_repository.h @@ -237,7 +237,7 @@ public: insert_values.push_back("'" + EscapeString(forage_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(forage_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_friends_repository.h b/common/repositories/base/base_friends_repository.h index 5b75b6f64..64a2042d6 100644 --- a/common/repositories/base/base_friends_repository.h +++ b/common/repositories/base/base_friends_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(friends_entry.type)); insert_values.push_back("'" + EscapeString(friends_entry.name) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_global_loot_repository.h b/common/repositories/base/base_global_loot_repository.h index e2d0d5822..87ebc18f3 100644 --- a/common/repositories/base/base_global_loot_repository.h +++ b/common/repositories/base/base_global_loot_repository.h @@ -285,7 +285,7 @@ public: insert_values.push_back("'" + EscapeString(global_loot_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(global_loot_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_gm_ips_repository.h b/common/repositories/base/base_gm_ips_repository.h index 6ce5814ea..84c124b83 100644 --- a/common/repositories/base/base_gm_ips_repository.h +++ b/common/repositories/base/base_gm_ips_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(gm_ips_entry.account_id)); insert_values.push_back("'" + EscapeString(gm_ips_entry.ip_address) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_goallists_repository.h b/common/repositories/base/base_goallists_repository.h index 15ab5c174..68de11598 100644 --- a/common/repositories/base/base_goallists_repository.h +++ b/common/repositories/base/base_goallists_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(goallists_entry.listid)); insert_values.push_back(std::to_string(goallists_entry.entry)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_graveyard_repository.h b/common/repositories/base/base_graveyard_repository.h index 942ea3736..54cc24657 100644 --- a/common/repositories/base/base_graveyard_repository.h +++ b/common/repositories/base/base_graveyard_repository.h @@ -219,7 +219,7 @@ public: insert_values.push_back(std::to_string(graveyard_entry.z)); insert_values.push_back(std::to_string(graveyard_entry.heading)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_ground_spawns_repository.h b/common/repositories/base/base_ground_spawns_repository.h index 308282e2c..f4be68297 100644 --- a/common/repositories/base/base_ground_spawns_repository.h +++ b/common/repositories/base/base_ground_spawns_repository.h @@ -291,7 +291,7 @@ public: insert_values.push_back("'" + EscapeString(ground_spawns_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(ground_spawns_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_group_id_repository.h b/common/repositories/base/base_group_id_repository.h index f0147e40f..d607541d1 100644 --- a/common/repositories/base/base_group_id_repository.h +++ b/common/repositories/base/base_group_id_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back("'" + EscapeString(group_id_entry.name) + "'"); insert_values.push_back(std::to_string(group_id_entry.ismerc)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_group_leaders_repository.h b/common/repositories/base/base_group_leaders_repository.h index f518e0d09..fc5264ef8 100644 --- a/common/repositories/base/base_group_leaders_repository.h +++ b/common/repositories/base/base_group_leaders_repository.h @@ -239,7 +239,7 @@ public: insert_values.push_back("'" + EscapeString(group_leaders_entry.mentoree) + "'"); insert_values.push_back(std::to_string(group_leaders_entry.mentor_percent)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_guild_members_repository.h b/common/repositories/base/base_guild_members_repository.h index 9ff83b91b..518150b61 100644 --- a/common/repositories/base/base_guild_members_repository.h +++ b/common/repositories/base/base_guild_members_repository.h @@ -239,7 +239,7 @@ public: insert_values.push_back("'" + EscapeString(guild_members_entry.public_note) + "'"); insert_values.push_back(std::to_string(guild_members_entry.alt)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_guild_ranks_repository.h b/common/repositories/base/base_guild_ranks_repository.h index 1d6375c70..d136defb3 100644 --- a/common/repositories/base/base_guild_ranks_repository.h +++ b/common/repositories/base/base_guild_ranks_repository.h @@ -251,7 +251,7 @@ public: insert_values.push_back(std::to_string(guild_ranks_entry.can_motd)); insert_values.push_back(std::to_string(guild_ranks_entry.can_warpeace)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_guild_relations_repository.h b/common/repositories/base/base_guild_relations_repository.h index 87359e110..7ea85b4a0 100644 --- a/common/repositories/base/base_guild_relations_repository.h +++ b/common/repositories/base/base_guild_relations_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(guild_relations_entry.guild2)); insert_values.push_back(std::to_string(guild_relations_entry.relation)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_guilds_repository.h b/common/repositories/base/base_guilds_repository.h index eb7d17046..312247a20 100644 --- a/common/repositories/base/base_guilds_repository.h +++ b/common/repositories/base/base_guilds_repository.h @@ -237,7 +237,7 @@ public: insert_values.push_back("'" + EscapeString(guilds_entry.channel) + "'"); insert_values.push_back("'" + EscapeString(guilds_entry.url) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_hackers_repository.h b/common/repositories/base/base_hackers_repository.h index e219e3a04..5dcf5fba3 100644 --- a/common/repositories/base/base_hackers_repository.h +++ b/common/repositories/base/base_hackers_repository.h @@ -219,7 +219,7 @@ public: insert_values.push_back("'" + EscapeString(hackers_entry.zone) + "'"); insert_values.push_back("'" + EscapeString(hackers_entry.date) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_instance_list_player_repository.h b/common/repositories/base/base_instance_list_player_repository.h index 43a6e0725..66553cca0 100644 --- a/common/repositories/base/base_instance_list_player_repository.h +++ b/common/repositories/base/base_instance_list_player_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(instance_list_player_entry.id)); insert_values.push_back(std::to_string(instance_list_player_entry.charid)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_instance_list_repository.h b/common/repositories/base/base_instance_list_repository.h index 02eba1606..dbe5a0dd2 100644 --- a/common/repositories/base/base_instance_list_repository.h +++ b/common/repositories/base/base_instance_list_repository.h @@ -225,7 +225,7 @@ public: insert_values.push_back(std::to_string(instance_list_entry.duration)); insert_values.push_back(std::to_string(instance_list_entry.never_expires)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_inventory_repository.h b/common/repositories/base/base_inventory_repository.h index 09d497101..3deb76fd7 100644 --- a/common/repositories/base/base_inventory_repository.h +++ b/common/repositories/base/base_inventory_repository.h @@ -281,7 +281,7 @@ public: insert_values.push_back(std::to_string(inventory_entry.ornamentidfile)); insert_values.push_back(std::to_string(inventory_entry.ornament_hero_model)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_inventory_snapshots_repository.h b/common/repositories/base/base_inventory_snapshots_repository.h index e5645f25a..a31e91da7 100644 --- a/common/repositories/base/base_inventory_snapshots_repository.h +++ b/common/repositories/base/base_inventory_snapshots_repository.h @@ -287,7 +287,7 @@ public: insert_values.push_back(std::to_string(inventory_snapshots_entry.ornamentidfile)); insert_values.push_back(std::to_string(inventory_snapshots_entry.ornament_hero_model)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_ip_exemptions_repository.h b/common/repositories/base/base_ip_exemptions_repository.h index d163f1c1f..e673d18d2 100644 --- a/common/repositories/base/base_ip_exemptions_repository.h +++ b/common/repositories/base/base_ip_exemptions_repository.h @@ -201,7 +201,7 @@ public: insert_values.push_back("'" + EscapeString(ip_exemptions_entry.exemption_ip) + "'"); insert_values.push_back(std::to_string(ip_exemptions_entry.exemption_amount)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_item_tick_repository.h b/common/repositories/base/base_item_tick_repository.h index edba624b7..5d788acca 100644 --- a/common/repositories/base/base_item_tick_repository.h +++ b/common/repositories/base/base_item_tick_repository.h @@ -219,7 +219,7 @@ public: insert_values.push_back("'" + EscapeString(item_tick_entry.it_qglobal) + "'"); insert_values.push_back(std::to_string(item_tick_entry.it_bagslot)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_items_repository.h b/common/repositories/base/base_items_repository.h index af99a05da..c309bc1b6 100644 --- a/common/repositories/base/base_items_repository.h +++ b/common/repositories/base/base_items_repository.h @@ -1895,7 +1895,7 @@ public: insert_values.push_back(std::to_string(items_entry.UNK241)); insert_values.push_back(std::to_string(items_entry.epicitem)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_ldon_trap_entries_repository.h b/common/repositories/base/base_ldon_trap_entries_repository.h index 5004afb65..86ab6e8f2 100644 --- a/common/repositories/base/base_ldon_trap_entries_repository.h +++ b/common/repositories/base/base_ldon_trap_entries_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(ldon_trap_entries_entry.id)); insert_values.push_back(std::to_string(ldon_trap_entries_entry.trap_id)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_ldon_trap_templates_repository.h b/common/repositories/base/base_ldon_trap_templates_repository.h index 256a5102c..396345ea8 100644 --- a/common/repositories/base/base_ldon_trap_templates_repository.h +++ b/common/repositories/base/base_ldon_trap_templates_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back(std::to_string(ldon_trap_templates_entry.skill)); insert_values.push_back(std::to_string(ldon_trap_templates_entry.locked)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_level_exp_mods_repository.h b/common/repositories/base/base_level_exp_mods_repository.h index 9a7754b98..47fb482c3 100644 --- a/common/repositories/base/base_level_exp_mods_repository.h +++ b/common/repositories/base/base_level_exp_mods_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(level_exp_mods_entry.exp_mod)); insert_values.push_back(std::to_string(level_exp_mods_entry.aa_exp_mod)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_lfguild_repository.h b/common/repositories/base/base_lfguild_repository.h index 6fe079d2e..39a32a5c8 100644 --- a/common/repositories/base/base_lfguild_repository.h +++ b/common/repositories/base/base_lfguild_repository.h @@ -239,7 +239,7 @@ public: insert_values.push_back(std::to_string(lfguild_entry.timezone)); insert_values.push_back(std::to_string(lfguild_entry.timeposted)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_login_accounts_repository.h b/common/repositories/base/base_login_accounts_repository.h index 43084859b..767ea0ead 100644 --- a/common/repositories/base/base_login_accounts_repository.h +++ b/common/repositories/base/base_login_accounts_repository.h @@ -239,7 +239,7 @@ public: insert_values.push_back("'" + EscapeString(login_accounts_entry.created_at) + "'"); insert_values.push_back("'" + EscapeString(login_accounts_entry.updated_at) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_login_api_tokens_repository.h b/common/repositories/base/base_login_api_tokens_repository.h index 92bb75642..20be8143a 100644 --- a/common/repositories/base/base_login_api_tokens_repository.h +++ b/common/repositories/base/base_login_api_tokens_repository.h @@ -219,7 +219,7 @@ public: insert_values.push_back("'" + EscapeString(login_api_tokens_entry.created_at) + "'"); insert_values.push_back("'" + EscapeString(login_api_tokens_entry.updated_at) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_login_server_admins_repository.h b/common/repositories/base/base_login_server_admins_repository.h index b819a1d11..6d25eb4c9 100644 --- a/common/repositories/base/base_login_server_admins_repository.h +++ b/common/repositories/base/base_login_server_admins_repository.h @@ -231,7 +231,7 @@ public: insert_values.push_back("'" + EscapeString(login_server_admins_entry.registration_date) + "'"); insert_values.push_back("'" + EscapeString(login_server_admins_entry.registration_ip_address) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_login_server_list_types_repository.h b/common/repositories/base/base_login_server_list_types_repository.h index a7d5eec1a..5508e3704 100644 --- a/common/repositories/base/base_login_server_list_types_repository.h +++ b/common/repositories/base/base_login_server_list_types_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(login_server_list_types_entry.id)); insert_values.push_back("'" + EscapeString(login_server_list_types_entry.description) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_login_world_servers_repository.h b/common/repositories/base/base_login_world_servers_repository.h index 37435d4f5..8a21dc6b5 100644 --- a/common/repositories/base/base_login_world_servers_repository.h +++ b/common/repositories/base/base_login_world_servers_repository.h @@ -243,7 +243,7 @@ public: insert_values.push_back(std::to_string(login_world_servers_entry.is_server_trusted)); insert_values.push_back("'" + EscapeString(login_world_servers_entry.note) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_logsys_categories_repository.h b/common/repositories/base/base_logsys_categories_repository.h index e11965956..380897a76 100644 --- a/common/repositories/base/base_logsys_categories_repository.h +++ b/common/repositories/base/base_logsys_categories_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back(std::to_string(logsys_categories_entry.log_to_file)); insert_values.push_back(std::to_string(logsys_categories_entry.log_to_gmsay)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_lootdrop_entries_repository.h b/common/repositories/base/base_lootdrop_entries_repository.h index 872c7e87a..48d33f130 100644 --- a/common/repositories/base/base_lootdrop_entries_repository.h +++ b/common/repositories/base/base_lootdrop_entries_repository.h @@ -251,7 +251,7 @@ public: insert_values.push_back(std::to_string(lootdrop_entries_entry.npc_min_level)); insert_values.push_back(std::to_string(lootdrop_entries_entry.npc_max_level)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_lootdrop_repository.h b/common/repositories/base/base_lootdrop_repository.h index 9cd141f90..a0da43c83 100644 --- a/common/repositories/base/base_lootdrop_repository.h +++ b/common/repositories/base/base_lootdrop_repository.h @@ -219,7 +219,7 @@ public: insert_values.push_back("'" + EscapeString(lootdrop_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(lootdrop_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_loottable_entries_repository.h b/common/repositories/base/base_loottable_entries_repository.h index 113fe8094..52a8a738c 100644 --- a/common/repositories/base/base_loottable_entries_repository.h +++ b/common/repositories/base/base_loottable_entries_repository.h @@ -221,7 +221,7 @@ public: insert_values.push_back(std::to_string(loottable_entries_entry.mindrop)); insert_values.push_back(std::to_string(loottable_entries_entry.probability)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_loottable_repository.h b/common/repositories/base/base_loottable_repository.h index 81e12b02f..e0ab61a00 100644 --- a/common/repositories/base/base_loottable_repository.h +++ b/common/repositories/base/base_loottable_repository.h @@ -243,7 +243,7 @@ public: insert_values.push_back("'" + EscapeString(loottable_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(loottable_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_mail_repository.h b/common/repositories/base/base_mail_repository.h index f36028c80..39d2a086c 100644 --- a/common/repositories/base/base_mail_repository.h +++ b/common/repositories/base/base_mail_repository.h @@ -231,7 +231,7 @@ public: insert_values.push_back("'" + EscapeString(mail_entry.to) + "'"); insert_values.push_back(std::to_string(mail_entry.status)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_merchantlist_repository.h b/common/repositories/base/base_merchantlist_repository.h index 05e0adce3..2b87bc7b6 100644 --- a/common/repositories/base/base_merchantlist_repository.h +++ b/common/repositories/base/base_merchantlist_repository.h @@ -257,7 +257,7 @@ public: insert_values.push_back("'" + EscapeString(merchantlist_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(merchantlist_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_merchantlist_temp_repository.h b/common/repositories/base/base_merchantlist_temp_repository.h index a3c347e57..87d96dfb1 100644 --- a/common/repositories/base/base_merchantlist_temp_repository.h +++ b/common/repositories/base/base_merchantlist_temp_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(merchantlist_temp_entry.itemid)); insert_values.push_back(std::to_string(merchantlist_temp_entry.charges)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_name_filter_repository.h b/common/repositories/base/base_name_filter_repository.h index 1dfc8fb0b..93273046a 100644 --- a/common/repositories/base/base_name_filter_repository.h +++ b/common/repositories/base/base_name_filter_repository.h @@ -195,7 +195,7 @@ public: insert_values.push_back("'" + EscapeString(name_filter_entry.name) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_npc_emotes_repository.h b/common/repositories/base/base_npc_emotes_repository.h index c312fac61..c32939af1 100644 --- a/common/repositories/base/base_npc_emotes_repository.h +++ b/common/repositories/base/base_npc_emotes_repository.h @@ -213,7 +213,7 @@ public: insert_values.push_back(std::to_string(npc_emotes_entry.type)); insert_values.push_back("'" + EscapeString(npc_emotes_entry.text) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_npc_faction_entries_repository.h b/common/repositories/base/base_npc_faction_entries_repository.h index 25589d42e..5ce90f273 100644 --- a/common/repositories/base/base_npc_faction_entries_repository.h +++ b/common/repositories/base/base_npc_faction_entries_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back(std::to_string(npc_faction_entries_entry.npc_value)); insert_values.push_back(std::to_string(npc_faction_entries_entry.temp)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_npc_faction_repository.h b/common/repositories/base/base_npc_faction_repository.h index 2325fc4c2..22435c946 100644 --- a/common/repositories/base/base_npc_faction_repository.h +++ b/common/repositories/base/base_npc_faction_repository.h @@ -207,7 +207,7 @@ public: insert_values.push_back(std::to_string(npc_faction_entry.primaryfaction)); insert_values.push_back(std::to_string(npc_faction_entry.ignore_primary_assist)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_npc_scale_global_base_repository.h b/common/repositories/base/base_npc_scale_global_base_repository.h index 954bb2636..186018ad7 100644 --- a/common/repositories/base/base_npc_scale_global_base_repository.h +++ b/common/repositories/base/base_npc_scale_global_base_repository.h @@ -353,7 +353,7 @@ public: insert_values.push_back(std::to_string(npc_scale_global_base_entry.heal_scale)); insert_values.push_back("'" + EscapeString(npc_scale_global_base_entry.special_abilities) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_npc_spells_effects_entries_repository.h b/common/repositories/base/base_npc_spells_effects_entries_repository.h index 589e42d67..3d12df705 100644 --- a/common/repositories/base/base_npc_spells_effects_entries_repository.h +++ b/common/repositories/base/base_npc_spells_effects_entries_repository.h @@ -231,7 +231,7 @@ public: insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.se_limit)); insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.se_max)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_npc_spells_effects_repository.h b/common/repositories/base/base_npc_spells_effects_repository.h index 5803258be..b8e75e8d1 100644 --- a/common/repositories/base/base_npc_spells_effects_repository.h +++ b/common/repositories/base/base_npc_spells_effects_repository.h @@ -201,7 +201,7 @@ public: insert_values.push_back("'" + EscapeString(npc_spells_effects_entry.name) + "'"); insert_values.push_back(std::to_string(npc_spells_effects_entry.parent_list)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_npc_spells_entries_repository.h b/common/repositories/base/base_npc_spells_entries_repository.h index 58192ed7a..06f53c42a 100644 --- a/common/repositories/base/base_npc_spells_entries_repository.h +++ b/common/repositories/base/base_npc_spells_entries_repository.h @@ -255,7 +255,7 @@ public: insert_values.push_back(std::to_string(npc_spells_entries_entry.min_hp)); insert_values.push_back(std::to_string(npc_spells_entries_entry.max_hp)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_npc_spells_repository.h b/common/repositories/base/base_npc_spells_repository.h index ccf1791b0..b99c67bf3 100644 --- a/common/repositories/base/base_npc_spells_repository.h +++ b/common/repositories/base/base_npc_spells_repository.h @@ -309,7 +309,7 @@ public: insert_values.push_back(std::to_string(npc_spells_entry.idle_no_sp_recast_max)); insert_values.push_back(std::to_string(npc_spells_entry.idle_b_chance)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_npc_types_repository.h b/common/repositories/base/base_npc_types_repository.h index ea8452aa6..8c8fcf116 100644 --- a/common/repositories/base/base_npc_types_repository.h +++ b/common/repositories/base/base_npc_types_repository.h @@ -915,7 +915,7 @@ public: insert_values.push_back(std::to_string(npc_types_entry.flymode)); insert_values.push_back(std::to_string(npc_types_entry.always_aggro)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_npc_types_tint_repository.h b/common/repositories/base/base_npc_types_tint_repository.h index 9de65e925..dc4a1bbdf 100644 --- a/common/repositories/base/base_npc_types_tint_repository.h +++ b/common/repositories/base/base_npc_types_tint_repository.h @@ -359,7 +359,7 @@ public: insert_values.push_back(std::to_string(npc_types_tint_entry.grn9x)); insert_values.push_back(std::to_string(npc_types_tint_entry.blu9x)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_object_contents_repository.h b/common/repositories/base/base_object_contents_repository.h index 5e59200f2..c73145c6d 100644 --- a/common/repositories/base/base_object_contents_repository.h +++ b/common/repositories/base/base_object_contents_repository.h @@ -257,7 +257,7 @@ public: insert_values.push_back(std::to_string(object_contents_entry.augslot5)); insert_values.push_back(std::to_string(object_contents_entry.augslot6)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_object_repository.h b/common/repositories/base/base_object_repository.h index cd3a02e01..f2659d7a1 100644 --- a/common/repositories/base/base_object_repository.h +++ b/common/repositories/base/base_object_repository.h @@ -363,7 +363,7 @@ public: insert_values.push_back("'" + EscapeString(object_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(object_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_perl_event_export_settings_repository.h b/common/repositories/base/base_perl_event_export_settings_repository.h index 35f236a29..b54bf825f 100644 --- a/common/repositories/base/base_perl_event_export_settings_repository.h +++ b/common/repositories/base/base_perl_event_export_settings_repository.h @@ -227,7 +227,7 @@ public: insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_item)); insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_event)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_petitions_repository.h b/common/repositories/base/base_petitions_repository.h index d0aedad7e..c9cabfee8 100644 --- a/common/repositories/base/base_petitions_repository.h +++ b/common/repositories/base/base_petitions_repository.h @@ -279,7 +279,7 @@ public: insert_values.push_back(std::to_string(petitions_entry.ischeckedout)); insert_values.push_back(std::to_string(petitions_entry.senttime)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_pets_equipmentset_entries_repository.h b/common/repositories/base/base_pets_equipmentset_entries_repository.h index 6dc1f6261..2bf2f52e7 100644 --- a/common/repositories/base/base_pets_equipmentset_entries_repository.h +++ b/common/repositories/base/base_pets_equipmentset_entries_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back(std::to_string(pets_equipmentset_entries_entry.slot)); insert_values.push_back(std::to_string(pets_equipmentset_entries_entry.item_id)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_pets_equipmentset_repository.h b/common/repositories/base/base_pets_equipmentset_repository.h index 1015a8144..c041477c3 100644 --- a/common/repositories/base/base_pets_equipmentset_repository.h +++ b/common/repositories/base/base_pets_equipmentset_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back("'" + EscapeString(pets_equipmentset_entry.setname) + "'"); insert_values.push_back(std::to_string(pets_equipmentset_entry.nested_set)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_pets_repository.h b/common/repositories/base/base_pets_repository.h index 623c7cb67..ef4ddf7f1 100644 --- a/common/repositories/base/base_pets_repository.h +++ b/common/repositories/base/base_pets_repository.h @@ -233,7 +233,7 @@ public: insert_values.push_back(std::to_string(pets_entry.monsterflag)); insert_values.push_back(std::to_string(pets_entry.equipmentset)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_player_titlesets_repository.h b/common/repositories/base/base_player_titlesets_repository.h index f7562d5e6..4378090a6 100644 --- a/common/repositories/base/base_player_titlesets_repository.h +++ b/common/repositories/base/base_player_titlesets_repository.h @@ -201,7 +201,7 @@ public: insert_values.push_back(std::to_string(player_titlesets_entry.char_id)); insert_values.push_back(std::to_string(player_titlesets_entry.title_set)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_proximities_repository.h b/common/repositories/base/base_proximities_repository.h index 880a9fa97..2495da016 100644 --- a/common/repositories/base/base_proximities_repository.h +++ b/common/repositories/base/base_proximities_repository.h @@ -233,7 +233,7 @@ public: insert_values.push_back(std::to_string(proximities_entry.minz)); insert_values.push_back(std::to_string(proximities_entry.maxz)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_quest_globals_repository.h b/common/repositories/base/base_quest_globals_repository.h index 69b2a991f..0b20020e8 100644 --- a/common/repositories/base/base_quest_globals_repository.h +++ b/common/repositories/base/base_quest_globals_repository.h @@ -221,7 +221,7 @@ public: insert_values.push_back("'" + EscapeString(quest_globals_entry.value) + "'"); insert_values.push_back(std::to_string(quest_globals_entry.expdate)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_raid_details_repository.h b/common/repositories/base/base_raid_details_repository.h index 039d773a9..fc00b12be 100644 --- a/common/repositories/base/base_raid_details_repository.h +++ b/common/repositories/base/base_raid_details_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(raid_details_entry.locked)); insert_values.push_back("'" + EscapeString(raid_details_entry.motd) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_raid_members_repository.h b/common/repositories/base/base_raid_members_repository.h index 6483f26a7..983475640 100644 --- a/common/repositories/base/base_raid_members_repository.h +++ b/common/repositories/base/base_raid_members_repository.h @@ -239,7 +239,7 @@ public: insert_values.push_back(std::to_string(raid_members_entry.israidleader)); insert_values.push_back(std::to_string(raid_members_entry.islooter)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_reports_repository.h b/common/repositories/base/base_reports_repository.h index cc1ccfe5f..c3842c923 100644 --- a/common/repositories/base/base_reports_repository.h +++ b/common/repositories/base/base_reports_repository.h @@ -207,7 +207,7 @@ public: insert_values.push_back("'" + EscapeString(reports_entry.reported) + "'"); insert_values.push_back("'" + EscapeString(reports_entry.reported_text) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_respawn_times_repository.h b/common/repositories/base/base_respawn_times_repository.h index c234d3e5b..16fd1f2ef 100644 --- a/common/repositories/base/base_respawn_times_repository.h +++ b/common/repositories/base/base_respawn_times_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(respawn_times_entry.duration)); insert_values.push_back(std::to_string(respawn_times_entry.instance_id)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_rule_sets_repository.h b/common/repositories/base/base_rule_sets_repository.h index e3306ff04..2c6a4d679 100644 --- a/common/repositories/base/base_rule_sets_repository.h +++ b/common/repositories/base/base_rule_sets_repository.h @@ -195,7 +195,7 @@ public: insert_values.push_back("'" + EscapeString(rule_sets_entry.name) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_rule_values_repository.h b/common/repositories/base/base_rule_values_repository.h index 38d4eb1c5..44bce4518 100644 --- a/common/repositories/base/base_rule_values_repository.h +++ b/common/repositories/base/base_rule_values_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back("'" + EscapeString(rule_values_entry.rule_value) + "'"); insert_values.push_back("'" + EscapeString(rule_values_entry.notes) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_saylink_repository.h b/common/repositories/base/base_saylink_repository.h index aabb535e3..1bfc00807 100644 --- a/common/repositories/base/base_saylink_repository.h +++ b/common/repositories/base/base_saylink_repository.h @@ -195,7 +195,7 @@ public: insert_values.push_back("'" + EscapeString(saylink_entry.phrase) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_skill_caps_repository.h b/common/repositories/base/base_skill_caps_repository.h index 5ceee4757..fcafdcf48 100644 --- a/common/repositories/base/base_skill_caps_repository.h +++ b/common/repositories/base/base_skill_caps_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back(std::to_string(skill_caps_entry.cap)); insert_values.push_back(std::to_string(skill_caps_entry.class_)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_spawn2_repository.h b/common/repositories/base/base_spawn2_repository.h index 0006a9581..ce4d12ba8 100644 --- a/common/repositories/base/base_spawn2_repository.h +++ b/common/repositories/base/base_spawn2_repository.h @@ -297,7 +297,7 @@ public: insert_values.push_back("'" + EscapeString(spawn2_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(spawn2_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_spawn_condition_values_repository.h b/common/repositories/base/base_spawn_condition_values_repository.h index 209db098b..9a0d1668b 100644 --- a/common/repositories/base/base_spawn_condition_values_repository.h +++ b/common/repositories/base/base_spawn_condition_values_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back("'" + EscapeString(spawn_condition_values_entry.zone) + "'"); insert_values.push_back(std::to_string(spawn_condition_values_entry.instance_id)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_spawn_conditions_repository.h b/common/repositories/base/base_spawn_conditions_repository.h index 343e3887c..c4bc27594 100644 --- a/common/repositories/base/base_spawn_conditions_repository.h +++ b/common/repositories/base/base_spawn_conditions_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back(std::to_string(spawn_conditions_entry.onchange)); insert_values.push_back("'" + EscapeString(spawn_conditions_entry.name) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_spawn_events_repository.h b/common/repositories/base/base_spawn_events_repository.h index e9076136d..abf1e7573 100644 --- a/common/repositories/base/base_spawn_events_repository.h +++ b/common/repositories/base/base_spawn_events_repository.h @@ -267,7 +267,7 @@ public: insert_values.push_back(std::to_string(spawn_events_entry.argument)); insert_values.push_back(std::to_string(spawn_events_entry.strict)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_spawnentry_repository.h b/common/repositories/base/base_spawnentry_repository.h index e467d8397..8b00fe50c 100644 --- a/common/repositories/base/base_spawnentry_repository.h +++ b/common/repositories/base/base_spawnentry_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(spawnentry_entry.chance)); insert_values.push_back(std::to_string(spawnentry_entry.condition_value_filter)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_spawngroup_repository.h b/common/repositories/base/base_spawngroup_repository.h index a81509a35..62557ce2b 100644 --- a/common/repositories/base/base_spawngroup_repository.h +++ b/common/repositories/base/base_spawngroup_repository.h @@ -261,7 +261,7 @@ public: insert_values.push_back(std::to_string(spawngroup_entry.despawn_timer)); insert_values.push_back(std::to_string(spawngroup_entry.wp_spawns)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_spell_buckets_repository.h b/common/repositories/base/base_spell_buckets_repository.h index 4d0472fa8..b0c9abc52 100644 --- a/common/repositories/base/base_spell_buckets_repository.h +++ b/common/repositories/base/base_spell_buckets_repository.h @@ -203,7 +203,7 @@ public: insert_values.push_back("'" + EscapeString(spell_buckets_entry.key) + "'"); insert_values.push_back("'" + EscapeString(spell_buckets_entry.value) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_spell_globals_repository.h b/common/repositories/base/base_spell_globals_repository.h index c5936c51c..cc3a8e0d7 100644 --- a/common/repositories/base/base_spell_globals_repository.h +++ b/common/repositories/base/base_spell_globals_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back("'" + EscapeString(spell_globals_entry.qglobal) + "'"); insert_values.push_back("'" + EscapeString(spell_globals_entry.value) + "'"); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_spells_new_repository.h b/common/repositories/base/base_spells_new_repository.h index 8e54f1d52..f0930baf9 100644 --- a/common/repositories/base/base_spells_new_repository.h +++ b/common/repositories/base/base_spells_new_repository.h @@ -1607,7 +1607,7 @@ public: insert_values.push_back(std::to_string(spells_new_entry.field235)); insert_values.push_back(std::to_string(spells_new_entry.field236)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_start_zones_repository.h b/common/repositories/base/base_start_zones_repository.h index 7e8d8926a..347012500 100644 --- a/common/repositories/base/base_start_zones_repository.h +++ b/common/repositories/base/base_start_zones_repository.h @@ -299,7 +299,7 @@ public: insert_values.push_back("'" + EscapeString(start_zones_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(start_zones_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_starting_items_repository.h b/common/repositories/base/base_starting_items_repository.h index 4dca7a846..2a18b33e8 100644 --- a/common/repositories/base/base_starting_items_repository.h +++ b/common/repositories/base/base_starting_items_repository.h @@ -261,7 +261,7 @@ public: insert_values.push_back("'" + EscapeString(starting_items_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(starting_items_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_task_activities_repository.h b/common/repositories/base/base_task_activities_repository.h index c04b2b504..0bf3ca384 100644 --- a/common/repositories/base/base_task_activities_repository.h +++ b/common/repositories/base/base_task_activities_repository.h @@ -275,7 +275,7 @@ public: insert_values.push_back("'" + EscapeString(task_activities_entry.zones) + "'"); insert_values.push_back(std::to_string(task_activities_entry.optional)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_tasks_repository.h b/common/repositories/base/base_tasks_repository.h index 8091531aa..8c5aa3ff5 100644 --- a/common/repositories/base/base_tasks_repository.h +++ b/common/repositories/base/base_tasks_repository.h @@ -281,7 +281,7 @@ public: insert_values.push_back(std::to_string(tasks_entry.faction_reward)); insert_values.push_back("'" + EscapeString(tasks_entry.completion_emote) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_tasksets_repository.h b/common/repositories/base/base_tasksets_repository.h index 255d9bc81..a6fb2584a 100644 --- a/common/repositories/base/base_tasksets_repository.h +++ b/common/repositories/base/base_tasksets_repository.h @@ -197,7 +197,7 @@ public: insert_values.push_back(std::to_string(tasksets_entry.id)); insert_values.push_back(std::to_string(tasksets_entry.taskid)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_timers_repository.h b/common/repositories/base/base_timers_repository.h index 29f2d0c77..aff07d9b1 100644 --- a/common/repositories/base/base_timers_repository.h +++ b/common/repositories/base/base_timers_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back(std::to_string(timers_entry.duration)); insert_values.push_back(std::to_string(timers_entry.enable)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_titles_repository.h b/common/repositories/base/base_titles_repository.h index 00d63995c..d08374d2a 100644 --- a/common/repositories/base/base_titles_repository.h +++ b/common/repositories/base/base_titles_repository.h @@ -267,7 +267,7 @@ public: insert_values.push_back("'" + EscapeString(titles_entry.suffix) + "'"); insert_values.push_back(std::to_string(titles_entry.title_set)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_trader_repository.h b/common/repositories/base/base_trader_repository.h index bdd5f0d7a..330791e2b 100644 --- a/common/repositories/base/base_trader_repository.h +++ b/common/repositories/base/base_trader_repository.h @@ -221,7 +221,7 @@ public: insert_values.push_back(std::to_string(trader_entry.item_cost)); insert_values.push_back(std::to_string(trader_entry.slot_id)); - auto results = database.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_tradeskill_recipe_entries_repository.h b/common/repositories/base/base_tradeskill_recipe_entries_repository.h index 45c51af6a..d5a5351b7 100644 --- a/common/repositories/base/base_tradeskill_recipe_entries_repository.h +++ b/common/repositories/base/base_tradeskill_recipe_entries_repository.h @@ -231,7 +231,7 @@ public: insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.salvagecount)); insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.iscontainer)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_tradeskill_recipe_repository.h b/common/repositories/base/base_tradeskill_recipe_repository.h index 70855a17d..8156369c1 100644 --- a/common/repositories/base/base_tradeskill_recipe_repository.h +++ b/common/repositories/base/base_tradeskill_recipe_repository.h @@ -273,7 +273,7 @@ public: insert_values.push_back("'" + EscapeString(tradeskill_recipe_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(tradeskill_recipe_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_traps_repository.h b/common/repositories/base/base_traps_repository.h index 8047254e1..53e5883bd 100644 --- a/common/repositories/base/base_traps_repository.h +++ b/common/repositories/base/base_traps_repository.h @@ -333,7 +333,7 @@ public: insert_values.push_back("'" + EscapeString(traps_entry.content_flags) + "'"); insert_values.push_back("'" + EscapeString(traps_entry.content_flags_disabled) + "'"); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_tribute_levels_repository.h b/common/repositories/base/base_tribute_levels_repository.h index 99e7f816f..1754a10de 100644 --- a/common/repositories/base/base_tribute_levels_repository.h +++ b/common/repositories/base/base_tribute_levels_repository.h @@ -209,7 +209,7 @@ public: insert_values.push_back(std::to_string(tribute_levels_entry.cost)); insert_values.push_back(std::to_string(tribute_levels_entry.item_id)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_tributes_repository.h b/common/repositories/base/base_tributes_repository.h index 912124f0f..10da88ef5 100644 --- a/common/repositories/base/base_tributes_repository.h +++ b/common/repositories/base/base_tributes_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back("'" + EscapeString(tributes_entry.descr) + "'"); insert_values.push_back(std::to_string(tributes_entry.isguild)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_veteran_reward_templates_repository.h b/common/repositories/base/base_veteran_reward_templates_repository.h index 9a1cdd493..9a25e2b96 100644 --- a/common/repositories/base/base_veteran_reward_templates_repository.h +++ b/common/repositories/base/base_veteran_reward_templates_repository.h @@ -215,7 +215,7 @@ public: insert_values.push_back(std::to_string(veteran_reward_templates_entry.charges)); insert_values.push_back(std::to_string(veteran_reward_templates_entry.reward_slot)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_zone_points_repository.h b/common/repositories/base/base_zone_points_repository.h index 195f3330c..92cdaf7f8 100644 --- a/common/repositories/base/base_zone_points_repository.h +++ b/common/repositories/base/base_zone_points_repository.h @@ -327,7 +327,7 @@ public: insert_values.push_back(std::to_string(zone_points_entry.height)); insert_values.push_back(std::to_string(zone_points_entry.width)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/base/base_zone_repository.h b/common/repositories/base/base_zone_repository.h index fd174b96a..7e2066d42 100644 --- a/common/repositories/base/base_zone_repository.h +++ b/common/repositories/base/base_zone_repository.h @@ -729,7 +729,7 @@ public: insert_values.push_back("'" + EscapeString(zone_entry.content_flags_disabled) + "'"); insert_values.push_back(std::to_string(zone_entry.underworld_teleport_index)); - auto results = content_db.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), diff --git a/common/repositories/template/base_repository.template b/common/repositories/template/base_repository.template index 9227bede7..9bf695b1a 100644 --- a/common/repositories/template/base_repository.template +++ b/common/repositories/template/base_repository.template @@ -190,7 +190,7 @@ public: {{INSERT_ONE_ENTRIES}} - auto results = {{DATABASE_CONNECTION}}.QueryDatabase( + auto results = db.QueryDatabase( fmt::format( "{} VALUES ({})", BaseInsert(), From ff5ea82e389bdeed692076260b6c7ef05c0c7e66 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 18:52:14 -0600 Subject: [PATCH 18/26] Split task classes into their own cpp/h files to speed up incremental compilation and make things easier to maintain --- zone/CMakeLists.txt | 15 +- zone/client.h | 2 + zone/task_client_state.cpp | 2135 +++++++++++++++++ zone/task_client_state.h | 110 + zone/task_goal_list_manager.cpp | 149 ++ zone/task_goal_list_manager.h | 37 + zone/task_manager.cpp | 1652 +++++++++++++ zone/task_manager.h | 97 + zone/task_proximity_manager.cpp | 80 + zone/task_proximity_manager.h | 27 + zone/tasks.cpp | 4002 +------------------------------ zone/tasks.h | 225 -- 12 files changed, 4302 insertions(+), 4229 deletions(-) create mode 100644 zone/task_client_state.cpp create mode 100644 zone/task_client_state.h create mode 100644 zone/task_goal_list_manager.cpp create mode 100644 zone/task_goal_list_manager.h create mode 100644 zone/task_manager.cpp create mode 100644 zone/task_manager.h create mode 100644 zone/task_proximity_manager.cpp create mode 100644 zone/task_proximity_manager.h diff --git a/zone/CMakeLists.txt b/zone/CMakeLists.txt index 8d80e84c1..2d35cf470 100644 --- a/zone/CMakeLists.txt +++ b/zone/CMakeLists.txt @@ -133,6 +133,11 @@ SET(zone_sources special_attacks.cpp spell_effects.cpp spells.cpp + task_client_state.cpp + task_client_state.cpp + task_goal_list_manager.cpp + task_manager.cpp + task_proximity_manager.cpp tasks.cpp titles.cpp tradeskills.cpp @@ -151,8 +156,7 @@ SET(zone_sources zonedb.cpp zone_reload.cpp zone_store.cpp - zoning.cpp -) + zoning.cpp) SET(zone_headers aa.h @@ -252,6 +256,10 @@ SET(zone_headers spawn2.h spawngroup.h string_ids.h + task_client_state.h + task_goal_list_manager.h + task_manager.h + task_proximity_manager.h tasks.h titles.h trap.h @@ -265,8 +273,7 @@ SET(zone_headers zonedb.h zonedump.h zone_reload.h - zone_store.h -) + zone_store.h) ADD_EXECUTABLE(zone ${zone_sources} ${zone_headers}) diff --git a/zone/client.h b/zone/client.h index 0b92785f3..65423c2b2 100644 --- a/zone/client.h +++ b/zone/client.h @@ -65,6 +65,8 @@ namespace EQ #include "zone.h" #include "zonedb.h" #include "zone_store.h" +#include "task_manager.h" +#include "task_client_state.h" #ifdef _WINDOWS // since windows defines these within windef.h (which windows.h include) diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp new file mode 100644 index 000000000..996ef5dcf --- /dev/null +++ b/zone/task_client_state.cpp @@ -0,0 +1,2135 @@ +#include "../common/global_define.h" +#include "../common/misc_functions.h" +#include "../common/repositories/character_activities_repository.h" +#include "../common/repositories/character_tasks_repository.h" +#include "../common/repositories/completed_tasks_repository.h" +#include "../common/rulesys.h" +#include "client.h" +#include "queryserv.h" +#include "quest_parser_collection.h" +#include "task_client_state.h" +#include "zonedb.h" + +extern QueryServ *QServ; + +ClientTaskState::ClientTaskState() +{ + active_task_count = 0; + last_completed_task_loaded = 0; + checked_touch_activities = false; + + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + active_quests[i].slot = i; + active_quests[i].task_id = TASKSLOTEMPTY; + } + + active_task.slot = 0; + active_task.task_id = TASKSLOTEMPTY; + // TODO: shared task +} + +ClientTaskState::~ClientTaskState() +{ +} + +void ClientTaskState::SendTaskHistory(Client *client, int task_index) +{ + + LogTasks("[SendTaskHistory] Task history requested for completed task index [{}]", task_index); + + // We only sent the most recent 50 completed tasks, so we need to offset the Index the client sent to us. + + int adjusted_task_index = task_index; + if (completed_tasks.size() > 50) { + adjusted_task_index += (completed_tasks.size() - 50); + } + + if ((adjusted_task_index < 0) || (adjusted_task_index >= (int) completed_tasks.size())) { + return; + } + + int TaskID = completed_tasks[adjusted_task_index].task_id; + + if ((TaskID < 0) || (TaskID > MAXTASKS)) { + return; + } + + TaskInformation *Task = p_task_manager->p_task_data[TaskID]; + + if (Task == nullptr) { + return; + } + + TaskHistoryReplyHeader_Struct *task_history_reply; + TaskHistoryReplyData1_Struct *task_history_reply_data_1; + TaskHistoryReplyData2_Struct *task_history_reply_data_2; + + char *reply; + + int completed_activity_count = 0; + int packet_length = sizeof(TaskHistoryReplyHeader_Struct); + + for (int i = 0; i < Task->activity_count; i++) { + if (completed_tasks[adjusted_task_index].activity_done[i]) { + completed_activity_count++; + packet_length = packet_length + sizeof(TaskHistoryReplyData1_Struct) + + Task->activity_information[i].target_name.size() + 1 + + Task->activity_information[i].item_list.size() + 1 + + sizeof(TaskHistoryReplyData2_Struct) + + Task->activity_information[i].description_override.size() + 1; + } + } + + auto outapp = new EQApplicationPacket(OP_TaskHistoryReply, packet_length); + + task_history_reply = (TaskHistoryReplyHeader_Struct *) outapp->pBuffer; + + // We use the TaskIndex the client sent in the request + task_history_reply->TaskID = task_index; + task_history_reply->ActivityCount = completed_activity_count; + + reply = (char *) task_history_reply + sizeof(TaskHistoryReplyHeader_Struct); + + for (int i = 0; i < Task->activity_count; i++) { + if (completed_tasks[adjusted_task_index].activity_done[i]) { + task_history_reply_data_1 = (TaskHistoryReplyData1_Struct *) reply; + task_history_reply_data_1->ActivityType = Task->activity_information[i].activity_type; + reply = (char *) task_history_reply_data_1 + sizeof(TaskHistoryReplyData1_Struct); + VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].target_name.c_str()); + VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].item_list.c_str()); + task_history_reply_data_2 = (TaskHistoryReplyData2_Struct *) reply; + task_history_reply_data_2->GoalCount = Task->activity_information[i].goal_count; + task_history_reply_data_2->unknown04 = 0xffffffff; + task_history_reply_data_2->unknown08 = 0xffffffff; + task_history_reply_data_2->ZoneID = Task->activity_information[i].zone_ids.empty() ? 0 + : Task->activity_information[i].zone_ids.front(); + task_history_reply_data_2->unknown16 = 0x00000000; + reply = (char *) task_history_reply_data_2 + sizeof(TaskHistoryReplyData2_Struct); + VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].description_override.c_str()); + } + } + + + client->QueuePacket(outapp); + safe_delete(outapp); +} + +void ClientTaskState::EnableTask(int character_id, int task_count, int *task_list) +{ + // Check if the Task is already enabled for this client + std::vector tasks_enabled; + for (int i = 0; i < task_count; i++) { + + auto iterator = enabled_tasks.begin(); + bool add_task = true; + + while (iterator != enabled_tasks.end()) { + // If this task is already enabled, stop looking + if ((*iterator) == task_list[i]) { + add_task = false; + break; + } + // Our list of enabled tasks is sorted, so we can quit if we find a taskid higher than + // the one we are looking for. + if ((*iterator) > task_list[i]) { + break; + } + ++iterator; + } + + if (add_task) { + enabled_tasks.insert(iterator, task_list[i]); + // Make a note of the task we enabled, for later SQL generation + tasks_enabled.push_back(task_list[i]); + } + } + + LogTasksDetail("[EnableTask] New enabled task list"); + for (int enabled_task : enabled_tasks) { + LogTasksDetail("[EnableTask] enabled [{}] character_id [{}]", enabled_task, character_id); + } + + if (tasks_enabled.empty()) { + return; + } + + std::stringstream query_stream; + query_stream << "REPLACE INTO character_enabledtasks (charid, taskid) VALUES "; + for (unsigned int i = 0; i < tasks_enabled.size(); i++) { + query_stream << (i ? ", " : "") << StringFormat("(%i, %i)", character_id, tasks_enabled[i]); + } + + std::string query = query_stream.str(); + if (!tasks_enabled.empty()) { + database.QueryDatabase(query); + } + else { + LogTasks("[EnableTask] Called for character_id [{}] but, no tasks exist", character_id); + } +} + +void ClientTaskState::DisableTask(int character_id, int task_count, int *task_list) +{ + + // Check if the Task is enabled for this client + std::vector tasks_disabled; + + for (int i = 0; i < task_count; i++) { + auto iterator = enabled_tasks.begin(); + bool removeTask = false; + + while (iterator != enabled_tasks.end()) { + if ((*iterator) == task_list[i]) { + removeTask = true; + break; + } + + if ((*iterator) > task_list[i]) { + break; + } + + ++iterator; + } + + if (removeTask) { + enabled_tasks.erase(iterator); + tasks_disabled.push_back(task_list[i]); + } + } + + LogTasks("[DisableTask] New enabled task list "); + for (int enabled_task : enabled_tasks) { + LogTasks("[DisableTask] enabled_tasks [{}]", enabled_task); + } + + if (tasks_disabled.empty()) { + return; + } + + std::stringstream queryStream; + queryStream << StringFormat("DELETE FROM character_enabledtasks WHERE charid = %i AND (", character_id); + + for (unsigned int i = 0; i < tasks_disabled.size(); i++) + queryStream + << (i ? StringFormat("taskid = %i ", tasks_disabled[i]) : StringFormat( + "OR taskid = %i ", + tasks_disabled[i] + )); + + queryStream << ")"; + + std::string query = queryStream.str(); + + if (tasks_disabled.size()) { + database.QueryDatabase(query); + } + else { + LogTasks( + "[DisableTask] DisableTask called for characterID: [{}] ... but, no tasks exist", + character_id + ); + } +} + +bool ClientTaskState::IsTaskEnabled(int task_id) +{ + std::vector::iterator Iterator; + + Iterator = enabled_tasks.begin(); + + while (Iterator != enabled_tasks.end()) { + if ((*Iterator) == task_id) { return true; } + if ((*Iterator) > task_id) { break; } + ++Iterator; + } + + return false; +} + +int ClientTaskState::EnabledTaskCount(int task_set_id) +{ + + // Return the number of tasks in TaskSet that this character is enabled for. + + unsigned int enabled_task_index = 0; + unsigned int task_set_index = 0; + int enabled_task_count = 0; + + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } + + while ((enabled_task_index < enabled_tasks.size()) && + (task_set_index < p_task_manager->task_sets[task_set_id].size())) { + + if (enabled_tasks[enabled_task_index] == p_task_manager->task_sets[task_set_id][task_set_index]) { + enabled_task_count++; + enabled_task_index++; + task_set_index++; + continue; + } + + if (enabled_tasks[enabled_task_index] < p_task_manager->task_sets[task_set_id][task_set_index]) { + enabled_task_index++; + } + else { + task_set_index++; + } + + } + + return enabled_task_count; +} + +int ClientTaskState::ActiveTasksInSet(int task_set_id) +{ + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { + return -1; + } + + int active_task_in_set_count = 0; + for (int i : p_task_manager->task_sets[task_set_id]) { + if (IsTaskActive(i)) { + active_task_in_set_count++; + } + } + + return active_task_in_set_count; +} + +int ClientTaskState::CompletedTasksInSet(int task_set_id) +{ + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { + return -1; + } + + int completed_tasks_count = 0; + for (int i : p_task_manager->task_sets[task_set_id]) { + if (IsTaskCompleted(i)) { + completed_tasks_count++; + } + } + + return completed_tasks_count; +} + +bool ClientTaskState::HasSlotForTask(TaskInformation *task) +{ + if (task == nullptr) { + return false; + } + + switch (task->type) { + case TaskType::Task: + return active_task.task_id == TASKSLOTEMPTY; + case TaskType::Shared: + return false; // todo + case TaskType::Quest: + for (auto &active_quest : active_quests) { + if (active_quest.task_id == TASKSLOTEMPTY) { + return true; + } + } + case TaskType::E: + return false; // removed on live + } + + return false; +} + +int ClientTaskState::GetActiveTaskID(int index) +{ + // Return the task_id from the client's specified Active Task slot. + if ((index < 0) || (index >= MAXACTIVEQUESTS)) { + return 0; + } + + return active_quests[index].task_id; +} + +static void DeleteCompletedTaskFromDatabase(int character_id, int task_id) +{ + LogTasks("[DeleteCompletedTasksFromDatabase] character_id [{}], task_id [{}]", character_id, task_id); + + CompletedTasksRepository::DeleteWhere( + database, + fmt::format("charid = {} and taskid = {}", character_id, task_id) + ); +} + +bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation &task_info) +{ + bool all_activities_complete = true; + + TaskInformation *p_task_information = p_task_manager->p_task_data[task_info.task_id]; + if (p_task_information == nullptr) { + return true; + } + + // On loading the client state, all activities that are not completed, are + // marked as hidden. For Sequential (non-stepped) mode, we mark the first + // activity_information as active if not complete. + LogTasks( + "character_id [{}] task_id [{}] sequence_mode [{}]", + character_id, + task_info.task_id, + p_task_information->sequence_mode + ); + + if (p_task_information->sequence_mode == ActivitiesSequential) { + if (task_info.activity[0].activity_state != ActivityCompleted) { + task_info.activity[0].activity_state = ActivityActive; + } + + // Enable the next Hidden task. + for (int i = 0; i < p_task_information->activity_count; i++) { + if ((task_info.activity[i].activity_state == ActivityActive) && + (!p_task_information->activity_information[i].optional)) { + all_activities_complete = false; + break; + } + + if (task_info.activity[i].activity_state == ActivityHidden) { + task_info.activity[i].activity_state = ActivityActive; + all_activities_complete = false; + break; + } + } + + if (all_activities_complete && RuleB(TaskSystem, RecordCompletedTasks)) { + if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { + LogTasks("KeepOneRecord enabled"); + auto iterator = completed_tasks.begin(); + int erased_elements = 0; + while (iterator != completed_tasks.end()) { + int task_id = (*iterator).task_id; + if (task_id == task_info.task_id) { + iterator = completed_tasks.erase(iterator); + erased_elements++; + } + else { + ++iterator; + } + } + + LogTasks("Erased Element count is [{}]", erased_elements); + + if (erased_elements) { + last_completed_task_loaded -= erased_elements; + DeleteCompletedTaskFromDatabase(character_id, task_info.task_id); + } + } + + CompletedTaskInformation completed_task_information{}; + completed_task_information.task_id = task_info.task_id; + completed_task_information.completed_time = time(nullptr); + + for (int i = 0; i < p_task_information->activity_count; i++) { + completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == + ActivityCompleted); + } + + completed_tasks.push_back(completed_task_information); + } + + LogTasks("Returning sequential task, AllActivitiesComplete is [{}]", all_activities_complete); + + return all_activities_complete; + } + + // Stepped Mode + // TODO: This code is probably more complex than it needs to be + + bool current_step_complete = true; + + LogTasks( + "[UnlockActivities] Current step [{}] last_step [{}]", + task_info.current_step, + p_task_information->last_step + ); + + // If current_step is -1, this is the first call to this method since loading the + // client state. Unlock all activities with a step number of 0 + + if (task_info.current_step == -1) { + for (int i = 0; i < p_task_information->activity_count; i++) { + + if (p_task_information->activity_information[i].step_number == 0 && + task_info.activity[i].activity_state == ActivityHidden) { + task_info.activity[i].activity_state = ActivityActive; + // task_info.activity_information[i].updated=true; + } + } + task_info.current_step = 0; + } + + for (int current_step = task_info.current_step; current_step <= p_task_information->last_step; current_step++) { + for (int activity = 0; activity < p_task_information->activity_count; activity++) { + if (p_task_information->activity_information[activity].step_number == (int) task_info.current_step) { + if ((task_info.activity[activity].activity_state != ActivityCompleted) && + (!p_task_information->activity_information[activity].optional)) { + current_step_complete = false; + all_activities_complete = false; + break; + } + } + } + if (!current_step_complete) { + break; + } + task_info.current_step++; + } + + if (all_activities_complete) { + if (RuleB(TaskSystem, RecordCompletedTasks)) { + // If we are only keeping one completed record per task, and the player has done + // the same task again, erase the previous completed entry for this task. + if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { + LogTasksDetail("[UnlockActivities] KeepOneRecord enabled"); + auto iterator = completed_tasks.begin(); + int erased_elements = 0; + + while (iterator != completed_tasks.end()) { + int task_id = (*iterator).task_id; + if (task_id == task_info.task_id) { + iterator = completed_tasks.erase(iterator); + erased_elements++; + } + else { + ++iterator; + } + } + + LogTasksDetail("[UnlockActivities] Erased Element count is [{}]", erased_elements); + + if (erased_elements) { + last_completed_task_loaded -= erased_elements; + DeleteCompletedTaskFromDatabase(character_id, task_info.task_id); + } + } + + CompletedTaskInformation completed_task_information{}; + completed_task_information.task_id = task_info.task_id; + completed_task_information.completed_time = time(nullptr); + + for (int i = 0; i < p_task_information->activity_count; i++) { + completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == + ActivityCompleted); + } + + completed_tasks.push_back(completed_task_information); + } + return true; + } + + // Mark all non-completed tasks in the current step as active + for (int activity = 0; activity < p_task_information->activity_count; activity++) { + if ((p_task_information->activity_information[activity].step_number == (int) task_info.current_step) && + (task_info.activity[activity].activity_state == ActivityHidden)) { + task_info.activity[activity].activity_state = ActivityActive; + task_info.activity[activity].updated = true; + } + } + + return false; +} + +void ClientTaskState::UpdateTasksOnKill(Client *client, int npc_type_id) +{ + UpdateTasksByNPC(client, ActivityKill, npc_type_id); +} + +bool ClientTaskState::UpdateTasksOnSpeakWith(Client *client, int npc_type_id) +{ + return UpdateTasksByNPC(client, ActivitySpeakWith, npc_type_id); +} + +bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int npc_type_id) +{ + + int is_updating = false; + + // If the client has no tasks, there is nothing further to check. + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return false; + } + + // loop over the union of tasks and quests + for (auto &ActiveTask : active_tasks) { + auto current_task = &ActiveTask; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + // Check if there are any active kill activities for this p_task_information + auto p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + return false; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + // We are only interested in Kill activities + if (activity_info->activity_type != activity_type) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!activity_info->CheckZone(zone->GetZoneID())) { + LogTasks( + "[UPDATE] character [{}] task_id [{}] activity_id [{}] activity_type [{}] for NPC [{}] failed zone check", + client->GetName(), + current_task->task_id, + activity_id, + activity_type, + npc_type_id + ); + continue; + } + // Is the activity_information to kill this type of NPC ? + switch (activity_info->goal_method) { + case METHODSINGLEID: + if (activity_info->goal_id != npc_type_id) { + continue; + } + break; + + case METHODLIST: + if (!p_task_manager->goal_list_manager.IsInList( + activity_info->goal_id, + npc_type_id + )) { + continue; + } + break; + + default: + // If METHODQUEST, don't updated the activity_information here + continue; + } + // We found an active p_task_information to kill this type of NPC, so increment the done count + LogTasksDetail("Calling increment done count ByNPC"); + IncrementDoneCount(client, p_task_data, current_task->slot, activity_id); + is_updating = true; + } + } + + return is_updating; +} + +int ClientTaskState::ActiveSpeakTask(int npc_type_id) +{ + + // This method is to be used from Perl quests only and returns the task_id of the first + // active task found which has an active SpeakWith activity_information for this NPC. + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return 0; + } + + // loop over the union of tasks and quests + for (auto &active_task : active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + continue; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + if (activity_info->activity_type != ActivitySpeakWith) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!activity_info->CheckZone(zone->GetZoneID())) { + continue; + } + // Is the activity_information to speak with this type of NPC ? + if (activity_info->goal_method == METHODQUEST && activity_info->goal_id == npc_type_id) { + return current_task->task_id; + } + } + } + + return 0; +} + +int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) +{ + + // This method is to be used from Perl quests only and returns the activity_id of the first + // active activity_information found in the specified task which is to SpeakWith this NPC. + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return -1; + } + if (task_id <= 0 || task_id >= MAXTASKS) { + return -1; + } + + // loop over the union of tasks and quests + for (auto &active_task : active_tasks) { + auto current_task = &active_task; + if (current_task->task_id != task_id) { + continue; + } + + TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + continue; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + if (activity_info->activity_type != ActivitySpeakWith) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!activity_info->CheckZone(zone->GetZoneID())) { + continue; + } + + // Is the activity_information to speak with this type of NPC ? + if (activity_info->goal_method == METHODQUEST && activity_info->goal_id == npc_type_id) { + return activity_id; + } + } + return 0; + } + return 0; +} + +void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_type, int item_id, int count) +{ + + // This method updates the client's task activities of the specified type which relate + // to the specified item. + // + // Type should be one of ActivityLoot, ActivityTradeSkill, ActivityFish or ActivityForage + + // If the client has no tasks, there is nothing further to check. + + LogTasks( + "[UpdateTasksForItem] activity_type [{}] item_id [{}]", + activity_type, + item_id + ); + + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return; + } + + // loop over the union of tasks and quests + for (auto &active_task : active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + // Check if there are any active loot activities for this task + + TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + return; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + // We are only interested in the ActivityType we were called with + if (activity_info->activity_type != (int) activity_type) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!activity_info->CheckZone(zone->GetZoneID())) { + LogTasks( + "[UpdateTasksForItem] Error: Character [{}] activity_information type [{}] for Item [{}] failed zone check", + client->GetName(), + activity_type, + item_id + ); + continue; + } + // Is the activity_information related to this item ? + // + switch (activity_info->goal_method) { + + case METHODSINGLEID: + if (activity_info->goal_id != item_id) { continue; } + break; + + case METHODLIST: + if (!p_task_manager->goal_list_manager.IsInList( + activity_info->goal_id, + item_id + )) { continue; } + break; + + default: + // If METHODQUEST, don't updated the activity_information here + continue; + } + // We found an active task related to this item, so increment the done count + LogTasksDetail("[UpdateTasksForItem] Calling increment done count ForItem"); + IncrementDoneCount(client, p_task_data, current_task->slot, activity_id, count); + } + } +} + +void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) +{ + LogTasks("[UpdateTasksOnExplore] explore_id [{}]", explore_id); + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return; + } + + // loop over the union of tasks and quests + for (auto &active_task : active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + // Check if there are any active explore activities for this task + + TaskInformation *task_data = p_task_manager->p_task_data[current_task->task_id]; + if (task_data == nullptr) { + return; + } + + for (int activity_id = 0; activity_id < task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + // We are only interested in explore activities + if (activity_info->activity_type != ActivityExplore) { + continue; + } + if (!activity_info->CheckZone(zone->GetZoneID())) { + LogTasks( + "[UpdateTasksOnExplore] character [{}] explore_id [{}] failed zone check", + client->GetName(), + explore_id + ); + continue; + } + // Is the activity_information to explore this area id ? + switch (activity_info->goal_method) { + + case METHODSINGLEID: + if (activity_info->goal_id != explore_id) { + continue; + } + break; + + case METHODLIST: + if (!p_task_manager->goal_list_manager.IsInList( + activity_info->goal_id, + explore_id + )) { + continue; + } + break; + + default: + // If METHODQUEST, don't updated the activity_information here + continue; + } + + // We found an active task to explore this area, so set done count to goal count + // (Only a goal count of 1 makes sense for explore activities?) + LogTasks( + "[UpdateTasksOnExplore] character [{}] explore_id [{}] increment on explore", + client->GetName(), + explore_id + ); + + IncrementDoneCount( + client, + task_data, + current_task->slot, + activity_id, + activity_info->goal_count - current_task->activity[activity_id].done_count + ); + } + } +} + +bool ClientTaskState::UpdateTasksOnDeliver( + Client *client, + std::list &items, + int cash, + int npc_type_id +) +{ + bool is_updated = false; + + LogTasks("[UpdateTasksOnDeliver] [{}]", npc_type_id); + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return false; + } + + // loop over the union of tasks and quests + for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { + auto current_task = &active_tasks[i]; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + // Check if there are any active deliver activities for this task + TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + return false; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + + // We are only interested in Deliver activities + if (activity_info->activity_type != ActivityDeliver && + activity_info->activity_type != ActivityGiveCash) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!activity_info->CheckZone(zone->GetZoneID())) { + Log( + Logs::General, Logs::Tasks, + "[UPDATE] Char: %s Deliver activity_information failed zone check (current zone %i, need zone " + "%s", + client->GetName(), zone->GetZoneID(), activity_info->zones.c_str()); + continue; + } + // Is the activity_information to deliver to this NPCTypeID ? + if (activity_info->deliver_to_npc != npc_type_id) { + continue; + } + // Is the activity_information related to these items ? + // + if ((activity_info->activity_type == ActivityGiveCash) && cash) { + LogTasks("[UpdateTasksOnDeliver] Increment on GiveCash"); + IncrementDoneCount(client, p_task_data, i, activity_id, cash); + is_updated = true; + } + else { + for (auto &item : items) { + switch (activity_info->goal_method) { + case METHODSINGLEID: + if (activity_info->goal_id != item->GetID()) { + continue; + } + break; + + case METHODLIST: + if (!p_task_manager->goal_list_manager.IsInList( + activity_info->goal_id, + item->GetID())) { + continue; + } + break; + + default: + // If METHODQUEST, don't updated the activity_information here + continue; + } + // We found an active task related to this item, so increment the done count + LogTasks("[UpdateTasksOnDeliver] Increment on GiveItem"); + IncrementDoneCount( + client, + p_task_data, + current_task->slot, + activity_id, + item->GetCharges() <= 0 ? 1 : item->GetCharges() + ); + is_updated = true; + } + } + } + } + + return is_updated; +} + +void ClientTaskState::UpdateTasksOnTouch(Client *client, int zone_id) +{ + // If the client has no tasks, there is nothing further to check. + + LogTasks("[UpdateTasksOnTouch] [{}] ", zone_id); + if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return; + } + + // loop over the union of tasks and quests + for (auto &active_task : active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + // Check if there are any active explore activities for this task + TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + return; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (current_task->activity[activity_id].activity_state != ActivityActive) { + continue; + } + // We are only interested in touch activities + if (activity_info->activity_type != ActivityTouch) { + continue; + } + if (activity_info->goal_method != METHODSINGLEID) { + continue; + } + if (!activity_info->CheckZone(zone_id)) { + LogTasks( + "[UpdateTasksOnTouch] character [{}] Touch activity_information failed zone check", + client->GetName() + ); + continue; + } + + // We found an active task to zone into this zone, so set done count to goal count + // (Only a goal count of 1 makes sense for touch activities?) + LogTasks("[UpdateTasksOnTouch] Increment on Touch"); + IncrementDoneCount( + client, + p_task_data, + current_task->slot, + activity_id, + activity_info->goal_count - current_task->activity[activity_id].done_count + ); + } + } +} + +void ClientTaskState::IncrementDoneCount( + Client *client, + TaskInformation *task_information, + int task_index, + int activity_id, + int count, + bool ignore_quest_update +) +{ + Log(Logs::General, Logs::Tasks, "[UPDATE] IncrementDoneCount"); + + auto info = GetClientTaskInfo(task_information->type, task_index); + + if (info == nullptr) { + return; + } + + info->activity[activity_id].done_count += count; + + if (info->activity[activity_id].done_count > task_information->activity_information[activity_id].goal_count) { + info->activity[activity_id].done_count = task_information->activity_information[activity_id].goal_count; + } + + if (!ignore_quest_update) { + char buf[24]; + snprintf( + buf, + 23, + "%d %d %d", + info->activity[activity_id].done_count, + info->activity[activity_id].activity_id, + info->task_id + ); + buf[23] = '\0'; + parse->EventPlayer(EVENT_TASK_UPDATE, client, buf, 0); + } + + info->activity[activity_id].updated = true; + // Have we reached the goal count for this activity_information ? + if (info->activity[activity_id].done_count >= task_information->activity_information[activity_id].goal_count) { + Log( + Logs::General, Logs::Tasks, "[UPDATE] Done (%i) = Goal (%i) for activity_information %i", + info->activity[activity_id].done_count, + task_information->activity_information[activity_id].goal_count, + activity_id + ); + + // Flag the activity_information as complete + info->activity[activity_id].activity_state = ActivityCompleted; + // Unlock subsequent activities for this task + bool TaskComplete = UnlockActivities(client->CharacterID(), *info); + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskCompleted is %i", TaskComplete); + // and by the 'Task Stage Completed' message + client->SendTaskActivityComplete(info->task_id, activity_id, task_index, task_information->type); + // Send the updated task/activity_information list to the client + p_task_manager->SendSingleActiveTaskToClient(client, *info, TaskComplete, false); + // Inform the client the task has been updated, both by a chat message + client->Message(Chat::White, "Your task '%s' has been updated.", task_information->title.c_str()); + + if (task_information->activity_information[activity_id].goal_method != METHODQUEST) { + if (!ignore_quest_update) { + char buf[24]; + snprintf(buf, 23, "%d %d", info->task_id, info->activity[activity_id].activity_id); + buf[23] = '\0'; + parse->EventPlayer(EVENT_TASK_STAGE_COMPLETE, client, buf, 0); + } + /* QS: PlayerLogTaskUpdates :: Update */ + if (RuleB(QueryServ, PlayerLogTaskUpdates)) { + std::string event_desc = StringFormat( + "Task Stage Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", + info->task_id, + info->activity[activity_id].activity_id, + info->activity[activity_id].done_count, + client->GetZoneID(), + client->GetInstanceID()); + QServ->PlayerLogEvent(Player_Log_Task_Updates, client->CharacterID(), event_desc); + } + } + + // If this task is now complete, the Completed tasks will have been + // updated in UnlockActivities. Send the completed task list to the + // client. This is the same sequence the packets are sent on live. + if (TaskComplete) { + char buf[24]; + snprintf( + buf, + 23, + "%d %d %d", + info->activity[activity_id].done_count, + info->activity[activity_id].activity_id, + info->task_id + ); + buf[23] = '\0'; + parse->EventPlayer(EVENT_TASK_COMPLETE, client, buf, 0); + + /* QS: PlayerLogTaskUpdates :: Complete */ + if (RuleB(QueryServ, PlayerLogTaskUpdates)) { + std::string event_desc = StringFormat( + "Task Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", + info->task_id, + info->activity[activity_id].activity_id, + info->activity[activity_id].done_count, + client->GetZoneID(), + client->GetInstanceID()); + QServ->PlayerLogEvent(Player_Log_Task_Updates, client->CharacterID(), event_desc); + } + + p_task_manager->SendCompletedTasksToClient(client, this); + client->SendTaskActivityComplete(info->task_id, 0, task_index, task_information->type, 0); + p_task_manager->SaveClientState(client, this); + //c->SendTaskComplete(TaskIndex); + client->CancelTask(task_index, task_information->type); + //if(Task->reward_method != METHODQUEST) RewardTask(c, Task); + // If Experience and/or cash rewards are set, reward them from the task even if reward_method is METHODQUEST + RewardTask(client, task_information); + //RemoveTask(c, TaskIndex); + + } + + } + else { + // Send an updated packet for this single activity_information + p_task_manager->SendTaskActivityLong( + client, info->task_id, activity_id, task_index, + task_information->activity_information[activity_id].optional + ); + p_task_manager->SaveClientState(client, this); + } +} + +void ClientTaskState::RewardTask(Client *client, TaskInformation *task_information) +{ + + if (!task_information || !client) { + return; + } + + const EQ::ItemData *Item; + std::vector RewardList; + + switch (task_information->reward_method) { + case METHODSINGLEID: { + if (task_information->reward_id) { + client->SummonItem(task_information->reward_id); + Item = database.GetItem(task_information->reward_id); + if (Item) { + client->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); + } + } + break; + } + case METHODLIST: { + RewardList = p_task_manager->goal_list_manager.GetListContents(task_information->reward_id); + for (int i : RewardList) { + client->SummonItem(i); + Item = database.GetItem(i); + if (Item) { + client->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); + } + } + break; + } + default: { + // Nothing special done for METHODQUEST + break; + } + } + + if (!task_information->completion_emote.empty()) { + client->SendColoredText( + Chat::Yellow, + task_information->completion_emote + ); + } // unsure if they use this packet or color, should work + + // just use normal NPC faction ID stuff + if (task_information->faction_reward) { + client->SetFactionLevel( + client->CharacterID(), + task_information->faction_reward, + client->GetBaseClass(), + client->GetBaseRace(), + client->GetDeity() + ); + } + + if (task_information->cash_reward) { + int platinum, gold, silver, copper; + + copper = task_information->cash_reward; + client->AddMoneyToPP(copper, true); + + platinum = copper / 1000; + copper = copper - (platinum * 1000); + gold = copper / 100; + copper = copper - (gold * 100); + silver = copper / 10; + copper = copper - (silver * 10); + + std::string cash_message; + + if (platinum > 0) { + cash_message = "You receive "; + cash_message += itoa(platinum); + cash_message += " platinum"; + } + if (gold > 0) { + if (cash_message.length() == 0) { + cash_message = "You receive "; + } + else { + cash_message += ","; + } + cash_message += itoa(gold); + cash_message += " gold"; + } + if (silver > 0) { + if (cash_message.length() == 0) { + cash_message = "You receive "; + } + else { + cash_message += ","; + } + cash_message += itoa(silver); + cash_message += " silver"; + } + if (copper > 0) { + if (cash_message.length() == 0) { + cash_message = "You receive "; + } + else { + cash_message += ","; + } + cash_message += itoa(copper); + cash_message += " copper"; + } + cash_message += " pieces."; + client->Message(Chat::Yellow, cash_message.c_str()); + } + int32 experience_reward = task_information->experience_reward; + if (experience_reward > 0) { + client->AddEXP(experience_reward); + } + if (experience_reward < 0) { + uint32 pos_reward = experience_reward * -1; + // Minimal Level Based Exp reward Setting is 101 (1% exp at level 1) + if (pos_reward > 100 && pos_reward < 25700) { + uint8 max_level = pos_reward / 100; + uint8 exp_percent = pos_reward - (max_level * 100); + client->AddLevelBasedExp(exp_percent, max_level); + } + } + + client->SendSound(); +} + +bool ClientTaskState::IsTaskActive(int task_id) +{ + if (active_task.task_id == task_id) { + return true; + } + + if (active_task_count == 0 || task_id == 0) { + return false; + } + + for (auto &active_quest : active_quests) { + if (active_quest.task_id == task_id) { + return true; + } + } + + return false; +} + +void ClientTaskState::FailTask(Client *client, int task_id) +{ + LogTasks( + "[FailTask] Failing task for character [{}] task_id [{}] task_count [{}]", + client->GetCleanName(), + task_id, + active_task_count + ); + + if (active_task.task_id == task_id) { + client->SendTaskFailed(task_id, 0, TaskType::Task); + // Remove the task from the client + client->CancelTask(0, TaskType::Task); + return; + } + + // TODO: shared tasks + + if (active_task_count == 0) { + return; + } + + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + if (active_quests[i].task_id == task_id) { + client->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); + // Remove the task from the client + client->CancelTask(i, TaskType::Quest); + return; + } + } +} + +// TODO: Shared tasks +bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) +{ + LogTasks("[IsTaskActivityActive] task_id [{}] activity_id [{}]", task_id, activity_id); + + // Quick sanity check + if (activity_id < 0) { + return false; + } + if (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY) { + return false; + } + + int active_task_index = -1; + auto task_type = TaskType::Task; + + if (active_task.task_id == task_id) { + active_task_index = 0; + } + + if (active_task_index == -1) { + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + if (active_quests[i].task_id == task_id) { + active_task_index = i; + task_type = TaskType::Quest; + break; + } + } + } + + // The client does not have this task + if (active_task_index == -1) { + return false; + } + + auto info = GetClientTaskInfo(task_type, active_task_index); + + if (info == nullptr) { + return false; + } + + TaskInformation *p_task_data = p_task_manager->p_task_data[info->task_id]; + + // The task is invalid + if (p_task_data == nullptr) { + return false; + } + + // The activity_id is out of range + if (activity_id >= p_task_data->activity_count) { + return false; + } + + LogTasks( + "[IsTaskActivityActive] (Update) task_id [{}] activity_id [{}] activity_state", + task_id, + activity_id, + info->activity[activity_id].activity_state + ); + + return (info->activity[activity_id].activity_state == ActivityActive); +} + +void ClientTaskState::UpdateTaskActivity( + Client *client, + int task_id, + int activity_id, + int count, + bool ignore_quest_update /*= false*/) +{ + + Log( + Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState UpdateTaskActivity(%i, %i, %i).", task_id, activity_id, + count + ); + + // Quick sanity check + if (activity_id < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { + return; + } + + int active_task_index = -1; + auto type = TaskType::Task; + + if (active_task.task_id == task_id) { + active_task_index = 0; + } + + if (active_task_index == -1) { + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + if (active_quests[i].task_id == task_id) { + active_task_index = i; + type = TaskType::Quest; + break; + } + } + } + + // The client does not have this task + if (active_task_index == -1) { + return; + } + + auto info = GetClientTaskInfo(type, active_task_index); + + if (info == nullptr) { + return; + } + + TaskInformation *Task = p_task_manager->p_task_data[info->task_id]; + + // The task is invalid + if (Task == nullptr) { + return; + } + + // The activity_id is out of range + if (activity_id >= Task->activity_count) { + return; + } + + // The activity_information is not currently active + if (info->activity[activity_id].activity_state == ActivityHidden) { + return; + } + + Log(Logs::General, Logs::Tasks, "[UPDATE] Increment done count on UpdateTaskActivity %d %d", activity_id, count); + IncrementDoneCount(client, Task, active_task_index, activity_id, count, ignore_quest_update); +} + +void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activity_id) +{ + Log(Logs::General, Logs::Tasks, "[RESET] ClientTaskState ResetTaskActivity(%i, %i).", task_id, activity_id); + + // Quick sanity check + if (activity_id < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { + return; + } + + int active_task_index = -1; + auto type = TaskType::Task; + + if (active_task.task_id == task_id) { + active_task_index = 0; + } + + if (active_task_index == -1) { + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + if (active_quests[i].task_id == task_id) { + active_task_index = i; + type = TaskType::Quest; + break; + } + } + } + + // The client does not have this task + if (active_task_index == -1) { + return; + } + + auto info = GetClientTaskInfo(type, active_task_index); + + if (info == nullptr) { + return; + } + + TaskInformation *p_task_data = p_task_manager->p_task_data[info->task_id]; + if (p_task_data == nullptr) { + return; + } + + // The activity_id is out of range + if (activity_id >= p_task_data->activity_count) { + return; + } + + // The activity_information is not currently active + if (info->activity[activity_id].activity_state == ActivityHidden) { + return; + } + + Log(Logs::General, Logs::Tasks, "[RESET] Increment done count on ResetTaskActivity"); + IncrementDoneCount( + client, + p_task_data, + active_task_index, + activity_id, + (info->activity[activity_id].done_count * -1), + false + ); +} + +void ClientTaskState::ShowClientTasks(Client *client) +{ + client->Message(Chat::White, "Task Information:"); + if (active_task.task_id != TASKSLOTEMPTY) { + client->Message( + Chat::White, + "Task: %i %s", + active_task.task_id, + p_task_manager->p_task_data[active_task.task_id]->title.c_str() + ); + client->Message( + Chat::White, + " description: [%s]\n", + p_task_manager->p_task_data[active_task.task_id]->description.c_str() + ); + for (int activity_id = 0; activity_id < p_task_manager->GetActivityCount(active_task.task_id); activity_id++) { + client->Message( + Chat::White, + " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", + active_task.activity[activity_id].activity_id, + active_task.activity[activity_id].done_count, + active_task.activity[activity_id].activity_state + ); + } + } + + for (auto &active_quest : active_quests) { + if (active_quest.task_id == TASKSLOTEMPTY) { + continue; + } + + client->Message( + Chat::White, "Quest: %i %s", active_quest.task_id, + p_task_manager->p_task_data[active_quest.task_id]->title.c_str() + ); + + client->Message( + Chat::White, + " description: [%s]\n", + p_task_manager->p_task_data[active_quest.task_id]->description.c_str() + ); + + for (int j = 0; j < p_task_manager->GetActivityCount(active_quest.task_id); j++) { + client->Message( + Chat::White, + " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", + active_quest.activity[j].activity_id, + active_quest.activity[j].done_count, + active_quest.activity[j].activity_state + ); + } + } +} + +// TODO: Shared Task +int ClientTaskState::TaskTimeLeft(int task_id) +{ + if (active_task.task_id == task_id) { + int time_now = time(nullptr); + + TaskInformation *p_task_data = p_task_manager->p_task_data[task_id]; + if (p_task_data == nullptr) { + return -1; + } + + if (!p_task_data->duration) { + return -1; + } + + int time_left = (active_task.accepted_time + p_task_data->duration - time_now); + + return (time_left > 0 ? time_left : 0); + } + + if (active_task_count == 0) { + return -1; + } + + for (auto &active_quest : active_quests) { + if (active_quest.task_id != task_id) { + continue; + } + + int time_now = time(nullptr); + + TaskInformation *p_task_data = p_task_manager->p_task_data[active_quest.task_id]; + if (p_task_data == nullptr) { + return -1; + } + + if (!p_task_data->duration) { + return -1; + } + + int time_left = (active_quest.accepted_time + p_task_data->duration - time_now); + + // If Timeleft is negative, return 0, else return the number of seconds left + + return (time_left > 0 ? time_left : 0); + } + + return -1; +} + +int ClientTaskState::IsTaskCompleted(int task_id) +{ + + // Returns: -1 if RecordCompletedTasks is not true + // +1 if the task has been completed + // 0 if the task has not been completed + + if (!(RuleB(TaskSystem, RecordCompletedTasks))) { + return -1; + } + + for (auto &completed_task : completed_tasks) { + LogTasks("[IsTaskCompleted] Comparing compelted task [{}] with [{}]", completed_task.task_id, task_id); + if (completed_task.task_id == task_id) { + return 1; + } + } + + return 0; +} + +bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) +{ + // Returns true if the Task in the specified slot has a time limit that has been exceeded. + auto info = GetClientTaskInfo(task_type, index); + if (info == nullptr) { + return false; + } + + // make sure the task_id is at least maybe in our array + if (info->task_id <= 0 || info->task_id >= MAXTASKS) { + return false; + } + + int time_now = time(nullptr); + + TaskInformation *task_data = p_task_manager->p_task_data[info->task_id]; + if (task_data == nullptr) { + return false; + } + + return (task_data->duration && (info->accepted_time + task_data->duration <= time_now)); +} + +void ClientTaskState::TaskPeriodicChecks(Client *client) +{ + if (active_task.task_id != TASKSLOTEMPTY) { + if (TaskOutOfTime(TaskType::Task, 0)) { + // Send Red Task Failed Message + client->SendTaskFailed(active_task.task_id, 0, TaskType::Task); + // Remove the task from the client + client->CancelTask(0, TaskType::Task); + // It is a conscious decision to only fail one task per call to this method, + // otherwise the player will not see all the failed messages where multiple + // tasks fail at the same time. + return; + } + } + + // TODO: shared tasks -- although that will probably be manager in world checking and telling zones to fail us + + if (active_task_count == 0) { + return; + } + + // Check for tasks that have failed because they have not been completed in the specified time + // + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + if (active_quests[i].task_id == TASKSLOTEMPTY) { + continue; + } + + if (TaskOutOfTime(TaskType::Quest, i)) { + // Send Red Task Failed Message + client->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); + // Remove the task from the client + client->CancelTask(i, TaskType::Quest); + // It is a conscious decision to only fail one task per call to this method, + // otherwise the player will not see all the failed messages where multiple + // tasks fail at the same time. + break; + } + } + + // Check for activities that require zoning into a specific zone. + // This is done in this method because it gives an extra few seconds for the client screen to display + // the zone before we send the 'Task activity_information Completed' message. + // + if (!checked_touch_activities) { + UpdateTasksOnTouch(client, zone->GetZoneID()); + checked_touch_activities = true; + } +} + +bool ClientTaskState::IsTaskActivityCompleted(TaskType task_type, int index, int activity_id) +{ + switch (task_type) { + case TaskType::Task: + if (index != 0) { + return false; + } + return active_task.activity[activity_id].activity_state == ActivityCompleted; + case TaskType::Shared: + return false; // TODO: shared tasks + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + return active_quests[index].activity[activity_id].activity_state == ActivityCompleted; + } + default: + return false; + } + +} + +// should we be defaulting to hidden? +ActivityState ClientTaskState::GetTaskActivityState(TaskType task_type, int index, int activity_id) +{ + switch (task_type) { + case TaskType::Task: + if (index != 0) { + return ActivityHidden; + } + return active_task.activity[activity_id].activity_state; + case TaskType::Shared: + return ActivityHidden; // TODO: shared tasks + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + return active_quests[index].activity[activity_id].activity_state; + } + default: + return ActivityHidden; + } +} + +int ClientTaskState::GetTaskActivityDoneCount(TaskType task_type, int index, int activity_id) +{ + switch (task_type) { + case TaskType::Task: + if (index != 0) { + return 0; + } + return active_task.activity[activity_id].done_count; + case TaskType::Shared: + return 0; // TODO: shared tasks + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + return active_quests[index].activity[activity_id].done_count; + } + default: + return 0; + } +} + +int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id) +{ + if (active_task.task_id == task_id) { + return active_task.activity[activity_id].done_count; + } + + // TODO: shared tasks + + int active_task_index = -1; + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + if (active_quests[i].task_id == task_id) { + active_task_index = i; + break; + } + } + + if (active_task_index == -1) { + return 0; + } + + if (active_quests[active_task_index].activity[activity_id].done_count) { + return active_quests[active_task_index].activity[activity_id].done_count; + } + else { + return 0; + } +} + +int ClientTaskState::GetTaskStartTime(TaskType task_type, int index) +{ + switch (task_type) { + case TaskType::Task: + return active_task.accepted_time; + case TaskType::Quest: + return active_quests[index].accepted_time; + case TaskType::Shared: // TODO + default: + return -1; + } +} + +void ClientTaskState::CancelAllTasks(Client *client) +{ + + // This method exists solely to be called during #task reloadall + // It removes tasks from the in-game client state ready for them to be + // resent to the client, in case an updated task fails to load + + CancelTask(client, 0, TaskType::Task, false); + active_task.task_id = TASKSLOTEMPTY; + + for (int i = 0; i < MAXACTIVEQUESTS; i++) + if (active_quests[i].task_id != TASKSLOTEMPTY) { + CancelTask(client, i, TaskType::Quest, false); + active_quests[i].task_id = TASKSLOTEMPTY; + } + + // TODO: shared +} + +void ClientTaskState::CancelTask(Client *client, int sequence_number, TaskType task_type, bool remove_from_db) +{ + auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); + + CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; + cts->SequenceNumber = sequence_number; + cts->type = static_cast(task_type); + + Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask"); + + client->QueuePacket(outapp); + safe_delete(outapp); + + if (remove_from_db) { + RemoveTask(client, sequence_number, task_type); + } +} + +void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType task_type) +{ + int character_id = client->CharacterID(); + Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState Cancel Task %i ", sequence_number); + + int task_id = -1; + switch (task_type) { + case TaskType::Task: + if (sequence_number == 0) { + task_id = active_task.task_id; + } + break; + case TaskType::Quest: + if (sequence_number < MAXACTIVEQUESTS) { + task_id = active_quests[sequence_number].task_id; + } + break; + case TaskType::Shared: // TODO: + default: + break; + } + + 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, static_cast(task_type)) + ); + + switch (task_type) { + case TaskType::Task: + active_task.task_id = TASKSLOTEMPTY; + break; + case TaskType::Shared: + break; // TODO: shared tasks + case TaskType::Quest: + active_quests[sequence_number].task_id = TASKSLOTEMPTY; + active_task_count--; + break; + default: + break; + } +} + +void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) +{ + auto task_type = p_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) { + case TaskType::Task: { + if (active_task.task_id == task_id) { + auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); + CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; + cts->SequenceNumber = 0; + cts->type = static_cast(task_type); + LogTasks("[UPDATE] RemoveTaskByTaskID found Task [{}]", task_id); + client->QueuePacket(outapp); + safe_delete(outapp); + active_task.task_id = TASKSLOTEMPTY; + } + break; + } + case TaskType::Shared: { + break; // TODO: shared tasks + } + case TaskType::Quest: { + for (int active_quest = 0; active_quest < MAXACTIVEQUESTS; active_quest++) { + if (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); + LogTasks("[UPDATE] RemoveTaskByTaskID found Quest [{}] at index [{}]", task_id, active_quest); + active_quests[active_quest].task_id = TASKSLOTEMPTY; + active_task_count--; + client->QueuePacket(outapp); + safe_delete(outapp); + } + } + } + default: { + break; + } + } +} + +void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id, bool enforce_level_requirement) +{ + if (!p_task_manager || task_id < 0 || task_id >= MAXTASKS) { + client->Message(Chat::Red, "Task system not functioning, or task_id %i out of range.", task_id); + return; + } + + auto task = p_task_manager->p_task_data[task_id]; + + if (task == nullptr) { + client->Message(Chat::Red, "Invalid task_id %i", task_id); + return; + } + + bool max_tasks = false; + + switch (task->type) { + case TaskType::Task: + if (active_task.task_id != TASKSLOTEMPTY) { + max_tasks = true; + } + break; + case TaskType::Shared: // TODO: shared tasks + // if (something) + max_tasks = true; + break; + case TaskType::Quest: + if (active_task_count == MAXACTIVEQUESTS) { + max_tasks = true; + } + break; + default: + break; + } + + if (max_tasks) { + client->Message( + Chat::Red, + "You already have the maximum allowable number of active tasks (%i)", + MAXACTIVEQUESTS + ); + return; + } + + // only Quests can have more than one, so don't need to check others + if (task->type == TaskType::Quest) { + for (auto &active_quest : active_quests) { + if (active_quest.task_id == task_id) { + client->Message(Chat::Red, "You have already been assigned this task."); + return; + } + } + } + + if (enforce_level_requirement && !p_task_manager->ValidateLevel(task_id, client->GetLevel())) { + client->Message(Chat::Red, "You are outside the level range of this task."); + return; + } + + if (!p_task_manager->IsTaskRepeatable(task_id) && IsTaskCompleted(task_id)) { + return; + } + + // We do it this way, because when the Client cancels a task, it retains the sequence number of the remaining + // tasks in it's window, until something causes the TaskDescription packets to be sent again. We could just + // resend all the active task data to the client when it cancels a task, but that could be construed as a + // waste of bandwidth. + // + ClientTaskInformation *active_slot = nullptr; + switch (task->type) { + case TaskType::Task: + active_slot = &active_task; + break; + case TaskType::Shared: // TODO: shared + active_slot = nullptr; + break; + case TaskType::Quest: + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + Log(Logs::General, Logs::Tasks, + "[UPDATE] ClientTaskState Looking for free slot in slot %i, found task_id of %i", i, + active_quests[i].task_id); + if (active_quests[i].task_id == 0) { + active_slot = &active_quests[i]; + break; + } + } + break; + default: + break; + } + + // This shouldn't happen unless there is a bug in the handling of ActiveTaskCount somewhere + if (active_slot == nullptr) { + client->Message( + Chat::Red, + "You already have the maximum allowable number of active tasks (%i)", + MAXACTIVEQUESTS + ); + return; + } + + active_slot->task_id = task_id; + active_slot->accepted_time = time(nullptr); + active_slot->updated = true; + active_slot->current_step = -1; + + for (int activity_id = 0; activity_id < p_task_manager->p_task_data[task_id]->activity_count; activity_id++) { + active_slot->activity[activity_id].activity_id = activity_id; + active_slot->activity[activity_id].done_count = 0; + active_slot->activity[activity_id].activity_state = ActivityHidden; + active_slot->activity[activity_id].updated = true; + } + + UnlockActivities(client->CharacterID(), *active_slot); + + if (task->type == TaskType::Quest) { + active_task_count++; + } + + p_task_manager->SendSingleActiveTaskToClient(client, *active_slot, false, true); + client->Message( + Chat::White, + "You have been assigned the task '%s'.", + p_task_manager->p_task_data[task_id]->title.c_str() + ); + p_task_manager->SaveClientState(client, this); + std::string buf = std::to_string(task_id); + + NPC *npc = entity_list.GetID(npc_type_id)->CastToNPC(); + if (npc) { + parse->EventNPC(EVENT_TASK_ACCEPTED, npc, client, buf.c_str(), 0); + } +} + +void ClientTaskState::ProcessTaskProximities(Client *client, float x, float y, float z) +{ + float last_x = client->ProximityX(); + float last_y = client->ProximityY(); + float last_z = client->ProximityZ(); + + if ((last_x == x) && (last_y == y) && (last_z == z)) { + return; + } + + LogTasksDetail("[ProcessTaskProximities] Checking proximities for Position x[{}] y[{}] z[{}]", x, y, z); + int explore_id = p_task_manager->proximity_manager.CheckProximities(x, y, z); + if (explore_id > 0) { + LogTasksDetail( + "[ProcessTaskProximities] Position x[{}] y[{}] z[{}] is within proximity explore_id [{}]", + x, + y, + z, + explore_id + ); + + UpdateTasksOnExplore(client, explore_id); + } +} diff --git a/zone/task_client_state.h b/zone/task_client_state.h new file mode 100644 index 000000000..676f5383e --- /dev/null +++ b/zone/task_client_state.h @@ -0,0 +1,110 @@ +#ifndef EQEMU_TASK_CLIENT_STATE_H +#define EQEMU_TASK_CLIENT_STATE_H + +#include "tasks.h" +#include "../common/types.h" +#include +#include +#include +#include + +class ClientTaskState { + +public: + ClientTaskState(); + ~ClientTaskState(); + void ShowClientTasks(Client *client); + inline int GetActiveTaskCount() { return active_task_count; } + int GetActiveTaskID(int index); + bool IsTaskActivityCompleted(TaskType task_type, int index, int activity_id); + int GetTaskActivityDoneCount(TaskType task_type, int index, int activity_id); + int GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id); + int GetTaskStartTime(TaskType task_type, int index); + void AcceptNewTask(Client *client, int task_id, int npc_type_id, bool enforce_level_requirement = false); + void FailTask(Client *client, int task_id); + int TaskTimeLeft(int task_id); + int IsTaskCompleted(int task_id); + bool IsTaskActive(int task_id); + bool IsTaskActivityActive(int task_id, int activity_id); + ActivityState GetTaskActivityState(TaskType task_type, int index, int activity_id); + void UpdateTaskActivity(Client *client, int task_id, int activity_id, int count, bool ignore_quest_update = false); + void ResetTaskActivity(Client *client, int task_id, int activity_id); + void CancelTask(Client *client, int sequence_number, TaskType task_type, bool remove_from_db = true); + void CancelAllTasks(Client *client); + void RemoveTask(Client *client, int sequence_number, TaskType task_type); + void RemoveTaskByTaskID(Client *client, uint32 task_id); + bool UpdateTasksByNPC(Client *client, int activity_type, int npc_type_id); + void UpdateTasksOnKill(Client *client, int npc_type_id); + void UpdateTasksForItem(Client *client, ActivityType activity_type, int item_id, int count = 1); + void UpdateTasksOnExplore(Client *client, int explore_id); + bool UpdateTasksOnSpeakWith(Client *client, int npc_type_id); + bool UpdateTasksOnDeliver(Client *client, std::list &items, int cash, int npc_type_id); + void UpdateTasksOnTouch(Client *client, int zone_id); + void ProcessTaskProximities(Client *client, float x, float y, float z); + bool TaskOutOfTime(TaskType task_type, int index); + void TaskPeriodicChecks(Client *client); + void SendTaskHistory(Client *client, int task_index); + void RewardTask(Client *client, TaskInformation *task_information); + void EnableTask(int character_id, int task_count, int *task_list); + void DisableTask(int character_id, int task_count, int *task_list); + bool IsTaskEnabled(int task_id); + int EnabledTaskCount(int task_set_id); + int ActiveSpeakTask(int npc_type_id); + int ActiveSpeakActivity(int npc_type_id, int task_id); + int ActiveTasksInSet(int task_set_id); + int CompletedTasksInSet(int task_set_id); + bool HasSlotForTask(TaskInformation *task); + + inline bool HasFreeTaskSlot() { return active_task.task_id == TASKSLOTEMPTY; } + + friend class TaskManager; + +private: + bool UnlockActivities(int character_id, ClientTaskInformation &task_info); + void IncrementDoneCount( + Client *client, + TaskInformation *task_information, + int task_index, + int activity_id, + int count = 1, + bool ignore_quest_update = false + ); + inline ClientTaskInformation *GetClientTaskInfo(TaskType task_type, int index) + { + ClientTaskInformation *info = nullptr; + switch (task_type) { + case TaskType::Task: + if (index == 0) { + info = &active_task; + } + break; + case TaskType::Shared: + break; + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + info = &active_quests[index]; + } + break; + default: + break; + } + return info; + } + int active_task_count; + + union { // easier to loop over + struct { + ClientTaskInformation active_task; // only one + ClientTaskInformation active_quests[MAXACTIVEQUESTS]; + }; + ClientTaskInformation active_tasks[MAXACTIVEQUESTS + 1]; + }; + // Shared tasks should be limited to 1 as well + std::vector enabled_tasks; + std::vector completed_tasks; + int last_completed_task_loaded; + bool checked_touch_activities; +}; + + +#endif //EQEMU_TASK_CLIENT_STATE_H diff --git a/zone/task_goal_list_manager.cpp b/zone/task_goal_list_manager.cpp new file mode 100644 index 000000000..b53e87499 --- /dev/null +++ b/zone/task_goal_list_manager.cpp @@ -0,0 +1,149 @@ +#include "../common/global_define.h" +#include "../common/misc_functions.h" +#include "../common/repositories/goallists_repository.h" +#include "../common/rulesys.h" +#include "client.h" +#include "mob.h" +#include "quest_parser_collection.h" +#include "task_goal_list_manager.h" +#include "tasks.h" +#include "zonedb.h" + +TaskGoalListManager::TaskGoalListManager() +{ + goal_lists_count = 0; +} + +TaskGoalListManager::~TaskGoalListManager() {} + +bool TaskGoalListManager::LoadLists() +{ + task_goal_lists.clear(); + goal_lists_count = 0; + + std::string query = "SELECT `listid`, COUNT(`entry`) FROM `goallists` GROUP by `listid` ORDER BY `listid`"; + auto results = content_db.QueryDatabase(query); + if (!results.Success()) { + return false; + } + + goal_lists_count = results.RowCount(); + LogTasks("Loaded [{}] GoalLists", goal_lists_count); + + task_goal_lists.reserve(goal_lists_count); + + int list_index = 0; + for (auto row = results.begin(); row != results.end(); ++row) { + int list_id = atoi(row[0]); + int list_size = atoi(row[1]); + + task_goal_lists.push_back({list_id, 0, 0}); + + task_goal_lists[list_index].GoalItemEntries.reserve(list_size); + + list_index++; + } + + auto goal_lists = GoallistsRepository::GetWhere(content_db, "TRUE ORDER BY listid, entry ASC"); + for (list_index = 0; list_index < goal_lists_count; list_index++) { + + int list_id = task_goal_lists[list_index].ListID; + + for (auto &entry: goal_lists) { + if (entry.listid == list_id) { + if (entry.entry < task_goal_lists[list_index].Min) { + task_goal_lists[list_index].Min = entry.entry; + } + + if (entry.entry > task_goal_lists[list_index].Max) { + task_goal_lists[list_index].Max = entry.entry; + } + + task_goal_lists[list_index].GoalItemEntries.push_back(entry.entry); + + LogTasksDetail( + "Goal list index [{}] loading list [{}] entry [{}]", + list_index, + list_id, + entry.entry + ); + } + } + } + + return true; + +} + +int TaskGoalListManager::GetListByID(int list_id) +{ + + // Find the list with the specified ListID and return the index + auto it = std::find_if( + task_goal_lists.begin(), + task_goal_lists.end(), + [list_id](const TaskGoalList_Struct &t) { return t.ListID == list_id; } + ); + + if (it == task_goal_lists.end()) { + return -1; + } + + return std::distance(task_goal_lists.begin(), it); +} + +int TaskGoalListManager::GetFirstEntry(int list_id) +{ + int list_by_id = GetListByID(list_id); + + if ((list_by_id < 0) || (list_by_id >= goal_lists_count)) { + return -1; + } + + if (task_goal_lists[list_by_id].GoalItemEntries.empty()) { + return -1; + } + + return task_goal_lists[list_by_id].GoalItemEntries[0]; +} + +std::vector TaskGoalListManager::GetListContents(int list_index) +{ + std::vector list_contents; + int list_by_id = GetListByID(list_index); + + if ((list_by_id < 0) || (list_by_id >= goal_lists_count)) { + return list_contents; + } + + list_contents = task_goal_lists[list_by_id].GoalItemEntries; + + return list_contents; +} + +bool TaskGoalListManager::IsInList(int list_id, int entry) +{ + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i)", list_id, entry); + + int list_index = GetListByID(list_id); + + if ((list_index < 0) || (list_index >= goal_lists_count)) { + return false; + } + + if ((entry < task_goal_lists[list_index].Min) || (entry > task_goal_lists[list_index].Max)) { + return false; + } + + int first_entry = 0; + auto &task = task_goal_lists[list_index]; + auto it = std::find(task.GoalItemEntries.begin(), task.GoalItemEntries.end(), entry); + + if (it == task.GoalItemEntries.end()) { + return false; + } + + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i) returning true", list_index, entry); + + return true; +} diff --git a/zone/task_goal_list_manager.h b/zone/task_goal_list_manager.h new file mode 100644 index 000000000..b518599e4 --- /dev/null +++ b/zone/task_goal_list_manager.h @@ -0,0 +1,37 @@ +#ifndef EQEMU_TASK_GOAL_LIST_MANAGER_H +#define EQEMU_TASK_GOAL_LIST_MANAGER_H + +#include "tasks.h" +#include "../common/types.h" +#include +#include +#include +#include + +struct TaskGoalList_Struct { + int ListID; + int Min, Max; + std::vector GoalItemEntries; +}; + +// This is used for handling lists, loading them from the database, searching them. +// Used for lists of NPCs to kill, items to loot, etc, as well as lists of items to +// reward the player with on completion of the task. +class TaskGoalListManager { + +public: + TaskGoalListManager(); + ~TaskGoalListManager(); + bool LoadLists(); + int GetListByID(int list_id); + bool IsInList(int list_id, int entry); + int GetFirstEntry(int list_id); + std::vector GetListContents(int list_index); + +private: + std::vector task_goal_lists; + int goal_lists_count; +}; + + +#endif //EQEMU_TASK_GOAL_LIST_MANAGER_H diff --git a/zone/task_manager.cpp b/zone/task_manager.cpp new file mode 100644 index 000000000..96ab3ca82 --- /dev/null +++ b/zone/task_manager.cpp @@ -0,0 +1,1652 @@ +#include "../common/global_define.h" +#include "../common/misc_functions.h" +#include "../common/repositories/character_activities_repository.h" +#include "../common/repositories/character_tasks_repository.h" +#include "../common/repositories/completed_tasks_repository.h" +#include "../common/repositories/task_activities_repository.h" +#include "../common/repositories/tasks_repository.h" +#include "../common/repositories/tasksets_repository.h" +#include "client.h" +#include "string_ids.h" +#include "task_manager.h" + +TaskManager::TaskManager() +{ + for (auto &task : p_task_data) { + task = nullptr; + } +} + +TaskManager::~TaskManager() +{ + for (auto &task : p_task_data) { + if (task != nullptr) { + safe_delete(task); + } + } +} + +bool TaskManager::LoadTaskSets() +{ + // Clear all task sets in memory. Done so we can reload them on the fly if required by just calling + // this method again. + for (auto &task_set : task_sets) { + task_set.clear(); + } + + auto rows = TasksetsRepository::GetWhere( + content_db, + fmt::format( + "`id` > 0 AND `id` < {} AND `taskid` >= 0 AND `taskid` < {} ORDER BY `id`, `taskid` ASC", + MAXTASKSETS, + MAXTASKS + ) + ); + + for (auto &task_set: rows) { + task_sets[task_set.id].push_back(task_set.taskid); + LogTasksDetail("[LoadTaskSets] Adding task_id [{}] to task_set [{}]", task_set.taskid, task_set.id); + } + + return true; +} + +void TaskManager::ReloadGoalLists() +{ + if (!goal_list_manager.LoadLists()) { + Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadLists failed"); + } +} + +bool TaskManager::LoadTasks(int single_task) +{ + std::string task_query_filter = fmt::format("id = {}", single_task); + std::string query; + if (single_task == 0) { + if (!goal_list_manager.LoadLists()) { + LogTasks("[TaskManager::LoadTasks] LoadLists failed"); + } + + if (!LoadTaskSets()) { + LogTasks("[TaskManager::LoadTasks] LoadTaskSets failed"); + } + + task_query_filter = fmt::format("id < {}", MAXTASKS); + } + + // load task level data + auto repo_tasks = TasksRepository::GetWhere(content_db, task_query_filter); + + for (auto &task: repo_tasks) { + int task_id = task.id; + + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + // This shouldn't happen, as the SELECT is bounded by MAXTASKS + LogError("[TASKS]Task ID [{}] out of range while loading tasks from database", task_id); + continue; + } + + // load task data + p_task_data[task_id] = new TaskInformation; + p_task_data[task_id]->type = static_cast(task.type); + p_task_data[task_id]->duration = task.duration; + p_task_data[task_id]->duration_code = static_cast(task.duration_code); + p_task_data[task_id]->title = task.title; + p_task_data[task_id]->description = task.description; + p_task_data[task_id]->reward = task.reward; + p_task_data[task_id]->reward_id = task.rewardid; + p_task_data[task_id]->cash_reward = task.cashreward; + p_task_data[task_id]->experience_reward = task.xpreward; + p_task_data[task_id]->reward_method = (TaskMethodType) task.rewardmethod; + p_task_data[task_id]->faction_reward = task.faction_reward; + p_task_data[task_id]->min_level = task.minlevel; + p_task_data[task_id]->max_level = task.maxlevel; + p_task_data[task_id]->repeatable = task.repeatable; + p_task_data[task_id]->completion_emote = task.completion_emote; + p_task_data[task_id]->activity_count = 0; + p_task_data[task_id]->sequence_mode = ActivitiesSequential; + p_task_data[task_id]->last_step = 0; + + LogTasksDetail( + "[LoadTasks] (Task) task_id [{}] type [{}] duration [{}] duration_code [{}] title [{}] description [{}] " + " reward [{}] rewardid [{}] cashreward [{}] xpreward [{}] rewardmethod [{}] faction_reward [{}] minlevel [{}] " + " maxlevel [{}] repeatable [{}] completion_emote [{}] ", + task.id, + task.type, + task.duration, + task.duration_code, + task.title, + task.description, + task.reward, + task.rewardid, + task.cashreward, + task.xpreward, + task.rewardmethod, + task.faction_reward, + task.minlevel, + task.maxlevel, + task.repeatable, + task.completion_emote + ); + } + + LogTasks("Loaded [{}] Tasks", repo_tasks.size()); + + std::string activities_query_filter = fmt::format( + "taskid = {} and activityid < {} ORDER BY taskid, activityid ASC", + single_task, + MAXACTIVITIESPERTASK + ); + + // if loading only a single task + if (single_task == 0) { + activities_query_filter = fmt::format( + "taskid < {} and activityid < {} ORDER BY taskid, activityid ASC", + MAXTASKS, + MAXACTIVITIESPERTASK + ); + } + + // load activity data + auto task_activities = TaskActivitiesRepository::GetWhere(content_db, activities_query_filter); + for (auto &task_activity: task_activities) { + int task_id = task_activity.taskid; + int step = task_activity.step; + int activity_id = task_activity.activityid; + + // create pointer to activity data since declarations get unruly long + int activity_index = p_task_data[task_id]->activity_count; + ActivityInformation *p_activity_data = &p_task_data[task_id]->activity_information[activity_index]; + + if ((task_id <= 0) || (task_id >= MAXTASKS) || (activity_id < 0) || (activity_id >= MAXACTIVITIESPERTASK)) { + + // This shouldn't happen, as the SELECT is bounded by MAXTASKS + LogTasks( + "Error: Task or activity_information ID ([{}], [{}]) out of range while loading activities from database", + task_id, + activity_id + ); + continue; + } + + if (p_task_data[task_id] == nullptr) { + LogTasks( + "Error: activity_information for non-existent task ([{}], [{}]) while loading activities from database", + task_id, + activity_id + ); + continue; + } + + p_task_data[task_id]->activity_information[p_task_data[task_id]->activity_count].step_number = step; + + if (step != 0) { + p_task_data[task_id]->sequence_mode = ActivitiesStepped; + } + + if (step > p_task_data[task_id]->last_step) { + p_task_data[task_id]->last_step = step; + } + + // Task Activities MUST be numbered sequentially from 0. If not, log an error + // and set the task to nullptr. Subsequent activities for this task will raise + // ERR_NOTASK errors. + // Change to (activityID != (Tasks[taskID]->activity_count + 1)) to index from 1 + if (activity_id != p_task_data[task_id]->activity_count) { + LogError( + "[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", + task_id, + activity_id + ); + p_task_data[task_id] = nullptr; + continue; + } + + // set activity data + p_activity_data->activity_type = task_activity.activitytype; + p_activity_data->target_name = task_activity.target_name; + p_activity_data->item_list = task_activity.item_list; + p_activity_data->skill_list = task_activity.skill_list; + p_activity_data->skill_id = std::stoi(task_activity.skill_list); // for older clients + p_activity_data->spell_list = task_activity.spell_list; + p_activity_data->spell_id = std::stoi(task_activity.spell_list); // for older clients + p_activity_data->description_override = task_activity.description_override; + p_activity_data->goal_id = task_activity.goalid; + p_activity_data->goal_method = (TaskMethodType) task_activity.goalmethod; + p_activity_data->goal_count = task_activity.goalcount; + p_activity_data->deliver_to_npc = task_activity.delivertonpc; + + // zones + p_activity_data->zones = task_activity.zones; + auto zones = SplitString( + task_activity.zones, + ';' + ); + + for (auto &&e : zones) { + p_activity_data->zone_ids.push_back(std::stoi(e)); + } + + p_activity_data->optional = task_activity.optional; + + LogTasksDetail( + "[LoadTasks] (Activity) task_id [{}] activity_id [{}] slot [{}] activity_type [{}] goal_id [{}] goal_method [{}] goal_count [{}] zones [{}]" + " target_name [{}] item_list [{}] skill_list [{}] spell_list [{}] description_override [{}]", + task_id, + activity_id, + p_task_data[task_id]->activity_count, + p_activity_data->activity_type, + p_activity_data->goal_id, + p_activity_data->goal_method, + p_activity_data->goal_count, + p_activity_data->zones.c_str(), + p_activity_data->target_name.c_str(), + p_activity_data->item_list.c_str(), + p_activity_data->skill_list.c_str(), + p_activity_data->spell_list.c_str(), + p_activity_data->description_override.c_str() + ); + + p_task_data[task_id]->activity_count++; + } + + LogTasks("Loaded [{}] Task Activities", task_activities.size()); + + return true; +} + +bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_state) +{ + // I am saving the slot in the ActiveTasks table, because unless a Task is cancelled/completed, the client + // doesn't seem to like tasks moving slots between zoning and you can end up with 'bogus' activities if the task + // previously in that slot had more activities than the one now occupying it. Hopefully retaining the slot + // number for the duration of a session will overcome this. + if (!client || !client_task_state) { + return false; + } + + const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::SaveClientState %s"; + + int character_id = client->CharacterID(); + + LogTasks("[SaveClientState] character_id [{}]", character_id); + + if (client_task_state->active_task_count > 0 || + client_task_state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks + for (auto &active_task : client_task_state->active_tasks) { + int task_id = active_task.task_id; + if (task_id == TASKSLOTEMPTY) { + continue; + } + + int slot = active_task.slot; + if (active_task.updated) { + + LogTasks( + "[SaveClientState] character_id [{}] updating task_index [{}] task_id [{}]", + character_id, + slot, + task_id + ); + + std::string query = StringFormat( + "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime) " + "VALUES (%i, %i, %i, %i, %i)", + character_id, + task_id, + slot, + static_cast(p_task_data[task_id]->type), + active_task.accepted_time + ); + + auto results = database.QueryDatabase(query); + if (!results.Success()) { + LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); + } + else { + active_task.updated = false; + } + } + + std::string query = + "REPLACE INTO character_activities (charid, taskid, activityid, donecount, completed) " + "VALUES "; + + int updated_activity_count = 0; + + for (int activity_index = 0; activity_index < p_task_data[task_id]->activity_count; ++activity_index) { + if (!active_task.activity[activity_index].updated) { + continue; + } + + LogTasks( + "[SaveClientState] Updating activity character_id [{}] updating task_index [{}] task_id [{}] activity_index [{}]", + character_id, + slot, + task_id, + activity_index + ); + + if (updated_activity_count == 0) { + query += + StringFormat( + "(%i, %i, %i, %i, %i)", character_id, task_id, activity_index, + active_task.activity[activity_index].done_count, + active_task.activity[activity_index].activity_state == + ActivityCompleted + ); + } + else { + query += + StringFormat( + ", (%i, %i, %i, %i, %i)", character_id, task_id, activity_index, + active_task.activity[activity_index].done_count, + active_task.activity[activity_index].activity_state == + ActivityCompleted + ); + } + + updated_activity_count++; + } + + if (updated_activity_count == 0) { + continue; + } + + auto results = database.QueryDatabase(query); + + if (!results.Success()) { + LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); + continue; + } + + active_task.updated = false; + for (int activity_index = 0; + activity_index < p_task_data[task_id]->activity_count; + ++activity_index) + active_task.activity[activity_index].updated = false; + } + } + + if (!RuleB(TaskSystem, RecordCompletedTasks) || + (client_task_state->completed_tasks.size() <= (unsigned int) client_task_state->last_completed_task_loaded)) { + client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); + return true; + } + + const char *completed_task_query = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " + "VALUES (%i, %i, %i, %i)"; + + for (unsigned int task_index = client_task_state->last_completed_task_loaded; + task_index < client_task_state->completed_tasks.size(); + task_index++) { + + int task_id = client_task_state->completed_tasks[task_index].task_id; + + if ((task_id <= 0) || (task_id >= MAXTASKS) || (p_task_data[task_id] == nullptr)) { + continue; + } + + // First we save a record with an activity_id of -1. + // This indicates this task was completed at the given time. We infer that all + // none optional activities were completed. + // + std::string query = StringFormat( + completed_task_query, + character_id, + client_task_state->completed_tasks[task_index].completed_time, + task_id, + -1 + ); + + auto results = database.QueryDatabase(query); + if (!results.Success()) { + LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); + continue; + } + + // If the Rule to record non-optional task completion is not enabled, don't save it + if (!RuleB(TaskSystem, RecordCompletedOptionalActivities)) { + continue; + } + + // Insert one record for each completed optional task. + for (int activity_id = 0; activity_id < p_task_data[task_id]->activity_count; activity_id++) { + if (!p_task_data[task_id]->activity_information[activity_id].optional || + !client_task_state->completed_tasks[task_index].activity_done[activity_id]) { + continue; + } + + query = StringFormat( + completed_task_query, + character_id, + client_task_state->completed_tasks[task_index].completed_time, + task_id, activity_id + ); + + results = database.QueryDatabase(query); + if (!results.Success()) { + LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); + } + } + } + + client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); + return true; +} + +int TaskManager::FirstTaskInSet(int task_set) +{ + if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { + return 0; + } + + if (task_sets[task_set].empty()) { + return 0; + } + + auto iterator = task_sets[task_set].begin(); + while (iterator != task_sets[task_set].end()) { + if ((*iterator) > 0) { + return (*iterator); + } + ++iterator; + } + + return 0; +} + +int TaskManager::LastTaskInSet(int task_set) +{ + if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { + return 0; + } + + if (task_sets[task_set].empty()) { + return 0; + } + + return task_sets[task_set][task_sets[task_set].size() - 1]; +} + +int TaskManager::NextTaskInSet(int task_set, int task_id) +{ + if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { + return 0; + } + + if (task_sets[task_set].empty()) { + return 0; + } + + for (int i : task_sets[task_set]) { + if (i > task_id) { + return i; + } + } + + return 0; +} + +bool TaskManager::ValidateLevel(int task_id, int player_level) +{ + if (p_task_data[task_id] == nullptr) { + return false; + } + + if (p_task_data[task_id]->min_level && (player_level < p_task_data[task_id]->min_level)) { + return false; + } + + if (p_task_data[task_id]->max_level && (player_level > p_task_data[task_id]->max_level)) { + return false; + } + + return true; +} + +std::string TaskManager::GetTaskName(uint32 task_id) +{ + if (task_id > 0 && task_id < MAXTASKS) { + if (p_task_data[task_id] != nullptr) { + return p_task_data[task_id]->title; + } + } + + return std::string(); +} + +TaskType TaskManager::GetTaskType(uint32 task_id) +{ + if (task_id > 0 && task_id < MAXTASKS) { + if (p_task_data[task_id] != nullptr) { + return p_task_data[task_id]->type; + } + } + return TaskType::Task; +} + +void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int task_set_id) +{ + int task_list[MAXCHOOSERENTRIES]; + int task_list_index = 0; + int player_level = client->GetLevel(); + + LogTasks( + "TaskSetSelector called for task_set_id [{}] EnableTaskSize is [{}]", + task_set_id, + client_task_state->enabled_tasks.size() + ); + + if (task_set_id <= 0 || task_set_id >= MAXTASKSETS) { + return; + } + + if (task_sets[task_set_id].empty()) { + // I think this is suppose to be yellow + mob->SayString( + client, + Chat::Yellow, + MAX_ACTIVE_TASKS, + client->GetName() + ); + return; + } + + bool all_enabled = false; + + // A task_id of 0 in a TaskSet indicates that all Tasks in the set are enabled for all players. + if (task_sets[task_set_id][0] == 0) { + LogTasks("[TaskSetSelector] TaskSets[{}][0] == 0. All Tasks in Set enabled.", task_set_id); + all_enabled = true; + } + + auto iterator = task_sets[task_set_id].begin(); + if (all_enabled) { + ++iterator; + } // skip first when all enabled since it's useless data + + while (iterator != task_sets[task_set_id].end() && task_list_index < MAXCHOOSERENTRIES) { + auto task = *iterator; + // verify level, we're not currently on it, repeatable status, if it's a (shared) task + // we aren't currently on another, and if it's enabled if not all_enabled + if ((all_enabled || client_task_state->IsTaskEnabled(task)) && ValidateLevel(task, player_level) && + !client_task_state->IsTaskActive(task) && client_task_state->HasSlotForTask(p_task_data[task]) && + // this slot checking is a bit silly, but we allow mixing of task types ... + (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { + task_list[task_list_index++] = task; + } + + ++iterator; + } + + if (task_list_index > 0) { + SendTaskSelector(client, mob, task_list_index, task_list); + } + else { + // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow + mob->SayString( + client, + Chat::Yellow, + MAX_ACTIVE_TASKS, + client->GetName() + ); + } +} + +// unlike the non-Quest version of this function, it does not check enabled, that is assumed the responsibility of the quest to handle +// we do however still want it to check the other stuff like level, active, room, etc +void TaskManager::TaskQuestSetSelector( + Client *client, + ClientTaskState *client_task_state, + Mob *mob, + int count, + int *tasks +) +{ + int task_list[MAXCHOOSERENTRIES]; + int task_list_index = 0; + int player_level = client->GetLevel(); + + LogTasks("[UPDATE] TaskQuestSetSelector called for array size [{}]", count); + + if (count <= 0) { + return; + } + + for (int i = 0; i < count; ++i) { + auto task = tasks[i]; + // verify level, we're not currently on it, repeatable status, if it's a (shared) task + // we aren't currently on another, and if it's enabled if not all_enabled + if (ValidateLevel(task, player_level) && !client_task_state->IsTaskActive(task) && + client_task_state->HasSlotForTask(p_task_data[task]) && + // this slot checking is a bit silly, but we allow mixing of task types ... + (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { + task_list[task_list_index++] = task; + } + } + + if (task_list_index > 0) { + SendTaskSelector(client, mob, task_list_index, task_list); + } + else { + // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow + mob->SayString( + client, + Chat::Yellow, + MAX_ACTIVE_TASKS, + client->GetName() + ); + } +} + +// sends task selector to client +void TaskManager::SendTaskSelector(Client *client, Mob *mob, int task_count, int *task_list) +{ + if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF) { + SendTaskSelectorNew(client, mob, task_count, task_list); + return; + } + // Titanium OpCode: 0x5e7c + LogTasks("TaskSelector for [{}] Tasks", task_count); + int player_level = client->GetLevel(); + + // Check if any of the tasks exist + for (int i = 0; i < task_count; i++) { + if (p_task_data[task_list[i]] != nullptr) { + break; + } + } + + int valid_task_count = 0; + + for (int i = 0; i < task_count; i++) { + if (!ValidateLevel(task_list[i], player_level)) { + continue; + } + if (client->IsTaskActive(task_list[i])) { + continue; + } + if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { + continue; + } + + valid_task_count++; + } + + if (valid_task_count == 0) { + return; + } + + SerializeBuffer buf(50 * valid_task_count); + + buf.WriteUInt32(valid_task_count); + buf.WriteUInt32(2); // task type, live doesn't let you send more than one type, but we do? + buf.WriteUInt32(mob->GetID()); + + for (int task_index = 0; task_index < task_count; task_index++) { + if (!ValidateLevel(task_list[task_index], player_level)) { + continue; + } + if (client->IsTaskActive(task_list[task_index])) { + continue; + } + if (!IsTaskRepeatable(task_list[task_index]) && client->IsTaskCompleted(task_list[task_index])) { + continue; + } + + buf.WriteUInt32(task_list[task_index]); // task_id + + // affects color, difficulty? + if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { + buf.WriteFloat(1.0f); + } + buf.WriteUInt32(p_task_data[task_list[task_index]]->duration); + buf.WriteUInt32(static_cast(p_task_data[task_list[task_index]]->duration_code)); + + buf.WriteString(p_task_data[task_list[task_index]]->title); // max 64 with null + buf.WriteString(p_task_data[task_list[task_index]]->description); // max 4000 with null + + // Has reward set flag + if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { + buf.WriteUInt8(0); + } + + buf.WriteUInt32(p_task_data[task_list[task_index]]->activity_count); + + for (int activity_index = 0; + activity_index < p_task_data[task_list[task_index]]->activity_count; + ++activity_index) { + buf.WriteUInt32(activity_index); // ActivityNumber + auto &activity = p_task_data[task_list[task_index]]->activity_information[activity_index]; + buf.WriteUInt32(activity.activity_type); + buf.WriteUInt32(0); // solo, group, raid? + buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) + buf.WriteString(activity.item_list); // max length 64 in these clients + buf.WriteUInt32(activity.goal_count); + buf.WriteInt32(activity.skill_id); + buf.WriteInt32(activity.spell_id); + buf.WriteInt32(activity.zone_ids.empty() ? 0 : activity.zone_ids.front()); + buf.WriteString(activity.description_override); + } + } + + auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf); + + client->QueuePacket(outapp); + safe_delete(outapp); +} + +void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, int *task_list) +{ + LogTasks("SendTaskSelectorNew for [{}] Tasks", task_count); + + int player_level = client->GetLevel(); + + // Check if any of the tasks exist + for (int i = 0; i < task_count; i++) { + if (p_task_data[task_list[i]] != nullptr) { + break; + } + } + + int valid_tasks_count = 0; + for (int task_index = 0; task_index < task_count; task_index++) { + if (!ValidateLevel(task_list[task_index], player_level)) { + continue; + } + if (client->IsTaskActive(task_list[task_index])) { + continue; + } + if (!IsTaskRepeatable(task_list[task_index]) && client->IsTaskCompleted(task_list[task_index])) { + continue; + } + + valid_tasks_count++; + } + + if (valid_tasks_count == 0) { + return; + } + + SerializeBuffer buf(50 * valid_tasks_count); + + buf.WriteUInt32(valid_tasks_count); // TaskCount + buf.WriteUInt32(2); // Type, valid values: 0-3. 0 = Task, 1 = Shared Task, 2 = Quest, 3 = ??? -- should fix maybe some day, but we let more than 1 type through :P + // so I guess an NPC can only offer one type of quests or we can only open a selection with one type :P (so quest call can tell us I guess) + // this is also sent in OP_TaskDescription + buf.WriteUInt32(mob->GetID()); // TaskGiver + + for (int i = 0; i < task_count; i++) { // max 40 + if (!ValidateLevel(task_list[i], player_level)) { + continue; + } + if (client->IsTaskActive(task_list[i])) { + continue; + } + if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { + continue; + } + + buf.WriteUInt32(task_list[i]); // task_id + buf.WriteFloat(1.0f); // affects color, difficulty? + buf.WriteUInt32(p_task_data[task_list[i]]->duration); + buf.WriteUInt32(static_cast(p_task_data[task_list[i]]->duration_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited + + buf.WriteString(p_task_data[task_list[i]]->title); // max 64 with null + buf.WriteString(p_task_data[task_list[i]]->description); // max 4000 with null + + buf.WriteUInt8(0); // Has reward set flag + buf.WriteUInt32(p_task_data[task_list[i]]->activity_count); // activity_count + + for (int j = 0; j < p_task_data[task_list[i]]->activity_count; ++j) { + buf.WriteUInt32(j); // ActivityNumber + auto &activity = p_task_data[task_list[i]]->activity_information[j]; + buf.WriteUInt32(activity.activity_type); // ActivityType + buf.WriteUInt32(0); // solo, group, raid? + buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) + + // this string is item names + buf.WriteLengthString(activity.item_list); + + buf.WriteUInt32(activity.goal_count); // GoalCount + + // this string is skill IDs? probably one of the "use on" tasks + buf.WriteLengthString(activity.skill_list); + + // this string is spell IDs? probably one of the "use on" tasks + buf.WriteLengthString(activity.spell_list); + + //buf.WriteString(itoa(Tasks[TaskList[i]]->activity_information[activity_id].ZoneID)); + buf.WriteString(activity.zones); // Zone number in ascii max length 64, can be multiple with separated by ; + buf.WriteString(activity.description_override); // max length 128 -- overrides the automatic descriptions + // this doesn't appear to be shown to the client at all and isn't the same as zones ... defaults to '0' though + buf.WriteString(activity.zones); // Zone number in ascii max length 64, probably can be separated by ; too, haven't found it used + } + } + + auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf); + + client->QueuePacket(outapp); + safe_delete(outapp); +} + +int TaskManager::GetActivityCount(int task_id) +{ + if ((task_id > 0) && (task_id < MAXTASKS)) { + if (p_task_data[task_id]) { return p_task_data[task_id]->activity_count; } + } + + return 0; +} + +void TaskManager::ExplainTask(Client *client, int task_id) +{ + + // TODO: This method is not finished (hardly started). It was intended to + // explain in English, what each activity_information did, conditions for step unlocking, etc. + // + return; + + if (!client) { return; } + + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + client->Message(Chat::White, "task_id out-of-range."); + return; + } + + if (p_task_data[task_id] == nullptr) { + client->Message(Chat::White, "Task does not exist."); + return; + } + + char explanation[1000], *ptr; + client->Message(Chat::White, "Task %4i: title: %s", task_id, p_task_data[task_id]->description.c_str()); + client->Message(Chat::White, "%3i Activities", p_task_data[task_id]->activity_count); + ptr = explanation; + for (int i = 0; i < p_task_data[task_id]->activity_count; i++) { + + sprintf(ptr, "Act: %3i: ", i); + ptr = ptr + strlen(ptr); + switch (p_task_data[task_id]->activity_information[i].activity_type) { + case ActivityDeliver: + sprintf(ptr, "Deliver"); + break; + } + + } +} + +bool TaskManager::IsTaskRepeatable(int task_id) +{ + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + return false; + } + + TaskInformation *task_data = p_task_manager->p_task_data[task_id]; + if (task_data == nullptr) { + return false; + } + + return task_data->repeatable; +} + +void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *client_task_state) +{ + int packet_length = 4; + + //vector::const_iterator iterator; + // The client only display the first 50 Completed Tasks send, so send the 50 most recent + int first_task_to_send = 0; + int last_task_to_send = client_task_state->completed_tasks.size(); + + if (client_task_state->completed_tasks.size() > 50) { + first_task_to_send = client_task_state->completed_tasks.size() - 50; + } + + LogTasks( + "[SendCompletedTasksToClient] completed task count [{}] first tank to send is [{}] last is [{}]", + client_task_state->completed_tasks.size(), + first_task_to_send, + last_task_to_send + ); + + /* + for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { + int task_id = (*iterator).task_id; + if(Tasks[task_id] == nullptr) continue; + PacketLength = PacketLength + 8 + strlen(Tasks[task_id]->title) + 1; + } + */ + for (int i = first_task_to_send; i < last_task_to_send; i++) { + int TaskID = client_task_state->completed_tasks[i].task_id; + if (p_task_data[TaskID] == nullptr) { continue; } + packet_length = packet_length + 8 + p_task_data[TaskID]->title.size() + 1; + } + + auto outapp = new EQApplicationPacket(OP_CompletedTasks, packet_length); + char *buf = (char *) outapp->pBuffer; + + //*(uint32 *)buf = activity_state->CompletedTasks.size(); + *(uint32 *) buf = last_task_to_send - first_task_to_send; + buf = buf + 4; + //for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { + // int task_id = (*iterator).task_id; + for (int i = first_task_to_send; i < last_task_to_send; i++) { + int task_id = client_task_state->completed_tasks[i].task_id; + if (p_task_data[task_id] == nullptr) { continue; } + *(uint32 *) buf = task_id; + buf = buf + 4; + + sprintf(buf, "%s", p_task_data[task_id]->title.c_str()); + buf = buf + strlen(buf) + 1; + //*(uint32 *)buf = (*iterator).CompletedTime; + *(uint32 *) buf = client_task_state->completed_tasks[i].completed_time; + buf = buf + 4; + } + + c->QueuePacket(outapp); + safe_delete(outapp); +} + +void TaskManager::SendTaskActivityShort(Client *client, int task_id, int activity_id, int client_task_index) +{ + // This activity_information Packet is sent for activities that have not yet been unlocked and appear as ??? + // in the client. + + TaskActivityShort_Struct *task_activity_short; + if (client->ClientVersionBit() & EQ::versions::maskRoFAndLater) { + auto outapp = new EQApplicationPacket(OP_TaskActivity, 25); + outapp->WriteUInt32(client_task_index); + outapp->WriteUInt32(static_cast(p_task_data[task_id]->type)); + outapp->WriteUInt32(task_id); + outapp->WriteUInt32(activity_id); + outapp->WriteUInt32(0); + outapp->WriteUInt32(0xffffffff); + outapp->WriteUInt8(0); + client->FastQueuePacket(&outapp); + + return; + } + + auto outapp = new EQApplicationPacket(OP_TaskActivity, sizeof(TaskActivityShort_Struct)); + + task_activity_short = (TaskActivityShort_Struct *) outapp->pBuffer; + task_activity_short->TaskSequenceNumber = client_task_index; + task_activity_short->unknown2 = static_cast(p_task_data[task_id]->type); + task_activity_short->TaskID = task_id; + task_activity_short->ActivityID = activity_id; + task_activity_short->unknown3 = 0x000000; + task_activity_short->ActivityType = 0xffffffff; + task_activity_short->unknown4 = 0x00000000; + + client->QueuePacket(outapp); + safe_delete(outapp); +} + +void TaskManager::SendTaskActivityLong( + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete +) +{ + + if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF) { + SendTaskActivityNew(client, task_id, activity_id, client_task_index, optional, task_complete); + return; + } + + SerializeBuffer buf(100); + + buf.WriteUInt32(client_task_index); + buf.WriteUInt32(static_cast(p_task_data[task_id]->type)); + buf.WriteUInt32(task_id); + buf.WriteUInt32(activity_id); + buf.WriteUInt32(0); // unknown3 + + // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes + // no difference to the client. All activity_information updates will be done based on our interal activity_information types. + if ((p_task_data[task_id]->activity_information[activity_id].activity_type > 0) && + p_task_data[task_id]->activity_information[activity_id].activity_type < 100) { + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].activity_type); + } + else { + buf.WriteUInt32(ActivityCastOn); + } // w/e! + + buf.WriteUInt32(optional); + buf.WriteUInt32(0); // solo, group, raid + + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].target_name); // target name string + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].item_list); // item name list + + if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].goal_count); + } + else { + // For our internal type GiveCash, where the goal count has the amount of cash that must be given, + // we don't want the donecount and goalcount fields cluttered up with potentially large numbers, so we just + // send a goalcount of 1, and a bit further down, a donecount of 1 if the activity_information is complete, 0 otherwise. + // The text3 field should decribe the exact activity_information goal, e.g. give 3500gp to Hasten Bootstrutter. + buf.WriteUInt32(1); + } + + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].skill_id); + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].spell_id); + buf.WriteUInt32( + p_task_data[task_id]->activity_information[activity_id].zone_ids.empty() ? 0 + : p_task_data[task_id]->activity_information[activity_id].zone_ids.front()); + buf.WriteUInt32(0); + + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].description_override); + + if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id)); + } + else { + // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. + buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= + p_task_data[task_id]->activity_information[activity_id].goal_count)); + } + + buf.WriteUInt32(1); // unknown + + auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); + + client->QueuePacket(outapp); + safe_delete(outapp); + +} + +// Used only by RoF+ Clients +void TaskManager::SendTaskActivityNew( + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete +) +{ + SerializeBuffer buf(100); + + buf.WriteUInt32(client_task_index); // TaskSequenceNumber + buf.WriteUInt32(static_cast(p_task_data[task_id]->type)); // task type + buf.WriteUInt32(task_id); + buf.WriteUInt32(activity_id); + buf.WriteUInt32(0); // unknown3 + + // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes + // no difference to the client. All activity_information updates will be done based on our interal activity_information types. + if ((p_task_data[task_id]->activity_information[activity_id].activity_type > 0) && + p_task_data[task_id]->activity_information[activity_id].activity_type < 100) { + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].activity_type); + } + else { + buf.WriteUInt32(ActivityCastOn); + } // w/e! + + buf.WriteUInt8(optional); + buf.WriteUInt32(0); // solo, group, raid + + // One of these unknown fields maybe related to the 'Use On' activity_information types + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].target_name); // target name string + + buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].item_list); // item name list + + // Goal Count + if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].goal_count); + } + else { + buf.WriteUInt32(1); + } // GoalCount + + // skill ID list ; separated + buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].skill_list); + + // spelll ID list ; separated -- unsure wtf we're doing here + buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].spell_list); + + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].zones); + buf.WriteUInt32(0); // unknown7 + + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].description_override); // description override + + if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32( + client->GetTaskActivityDoneCount( + p_task_data[task_id]->type, + client_task_index, + activity_id + )); // done_count + } + else { + // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. + buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= + p_task_data[task_id]->activity_information[activity_id].goal_count)); + } + + buf.WriteUInt8(1); // unknown9 + + buf.WriteString(p_task_data[task_id]->activity_information[activity_id].zones); + + auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); + + client->QueuePacket(outapp); + safe_delete(outapp); + +} + +void TaskManager::SendActiveTasksToClient(Client *client, bool task_complete) +{ + auto state = client->GetTaskState(); + if (!state) { + return; + } + + for (int task_index = 0; task_index < MAXACTIVEQUESTS + 1; task_index++) { + int task_id = state->active_tasks[task_index].task_id; + if ((task_id == 0) || (p_task_data[task_id] == 0)) { + continue; + } + int start_time = state->active_tasks[task_index].accepted_time; + + SendActiveTaskDescription( + client, task_id, state->active_tasks[task_index], start_time, p_task_data[task_id]->duration, + false + ); + LogTasks("[SendActiveTasksToClient] task_id [{}] activity_count [{}]", task_id, GetActivityCount(task_id)); + + int sequence = 0; + int fixed_index = p_task_data[task_id]->type == TaskType::Task ? 0 : task_index - 1; // hmmm fuck + for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { + if (client->GetTaskActivityState(p_task_data[task_id]->type, fixed_index, activity_id) != ActivityHidden) { + LogTasks( + "[SendActiveTasksToClient] (Long Update) task_id [{}] activity_id [{}] fixed_index [{}] task_complete [{}]", + task_id, + activity_id, + fixed_index, + task_complete ? "true" : "false" + ); + + if (activity_id == GetActivityCount(task_id) - 1) { + SendTaskActivityLong( + client, + task_id, + activity_id, + fixed_index, + p_task_data[task_id]->activity_information[activity_id].optional, + task_complete + ); + } + else { + SendTaskActivityLong( + client, + task_id, + activity_id, + fixed_index, + p_task_data[task_id]->activity_information[activity_id].optional, + 0 + ); + } + } + else { + LogTasks( + "[SendActiveTasksToClient] (Short Update) task_id [{}] activity_id [{}] fixed_index [{}]", + task_id, + activity_id, + fixed_index + ); + + SendTaskActivityShort(client, task_id, activity_id, fixed_index); + } + sequence++; + } + } +} + +void TaskManager::SendSingleActiveTaskToClient( + Client *client, ClientTaskInformation &task_info, bool task_complete, + bool bring_up_task_journal +) +{ + int task_id = task_info.task_id; + if (task_id == 0 || p_task_data[task_id] == nullptr) { + return; + } + + int start_time = task_info.accepted_time; + SendActiveTaskDescription( + client, + task_id, + task_info, + start_time, + p_task_data[task_id]->duration, + bring_up_task_journal + ); + Log(Logs::General, + Logs::Tasks, + "[UPDATE] SendSingleActiveTasksToClient: Task %i, Activities: %i", + task_id, + GetActivityCount(task_id)); + + for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { + if (task_info.activity[activity_id].activity_state != ActivityHidden) { + LogTasks("[SendSingleActiveTaskToClient] Long [{}] [{}] complete [{}]", + task_id, + activity_id, + task_complete); + if (activity_id == GetActivityCount(task_id) - 1) { + SendTaskActivityLong( + client, task_id, activity_id, task_info.slot, + p_task_data[task_id]->activity_information[activity_id].optional, task_complete + ); + } + else { + SendTaskActivityLong( + client, task_id, activity_id, task_info.slot, + p_task_data[task_id]->activity_information[activity_id].optional, 0 + ); + } + } + else { + LogTasks("[SendSingleActiveTaskToClient] Short [{}] [{}]", task_id, activity_id); + SendTaskActivityShort(client, task_id, activity_id, task_info.slot); + } + } +} + +void TaskManager::SendActiveTaskDescription( + Client *client, + int task_id, + ClientTaskInformation &task_info, + int start_time, + int duration, + bool bring_up_task_journal +) +{ + if ((task_id < 1) || (task_id >= MAXTASKS) || !p_task_data[task_id]) { + return; + } + + int packet_length = sizeof(TaskDescriptionHeader_Struct) + p_task_data[task_id]->title.length() + 1 + + sizeof(TaskDescriptionData1_Struct) + p_task_data[task_id]->description.length() + 1 + + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); + + // If there is an item make the reward text into a link to the item (only the first item if a list + // is specified). I have been unable to get multiple item links to work. + // + if (p_task_data[task_id]->reward_id && p_task_data[task_id]->item_link.empty()) { + int item_id = 0; + // If the reward is a list of items, and the first entry on the list is valid + if (p_task_data[task_id]->reward_method == METHODSINGLEID) { + item_id = p_task_data[task_id]->reward_id; + } + else if (p_task_data[task_id]->reward_method == METHODLIST) { + item_id = goal_list_manager.GetFirstEntry(p_task_data[task_id]->reward_id); + if (item_id < 0) { + item_id = 0; + } + } + + if (item_id) { + const EQ::ItemData *reward_item = database.GetItem(item_id); + + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemData); + linker.SetItemData(reward_item); + linker.SetTaskUse(); + p_task_data[task_id]->item_link = linker.GenerateLink(); + } + } + + packet_length += p_task_data[task_id]->reward.length() + 1 + p_task_data[task_id]->item_link.length() + 1; + + char *Ptr; + TaskDescriptionHeader_Struct *task_description_header; + TaskDescriptionData1_Struct *tdd1; + TaskDescriptionData2_Struct *tdd2; + TaskDescriptionTrailer_Struct *tdt; + + auto outapp = new EQApplicationPacket(OP_TaskDescription, packet_length); + + task_description_header = (TaskDescriptionHeader_Struct *) outapp->pBuffer; + + task_description_header->SequenceNumber = task_info.slot; + task_description_header->TaskID = task_id; + task_description_header->open_window = bring_up_task_journal; + task_description_header->task_type = static_cast(p_task_data[task_id]->type); + task_description_header->reward_type = 0; // TODO: 4 says Radiant Crystals else Ebon Crystals when shared task + + Ptr = (char *) task_description_header + sizeof(TaskDescriptionHeader_Struct); + + sprintf(Ptr, "%s", p_task_data[task_id]->title.c_str()); + Ptr += p_task_data[task_id]->title.length() + 1; + + tdd1 = (TaskDescriptionData1_Struct *) Ptr; + + tdd1->Duration = duration; + tdd1->dur_code = static_cast(p_task_data[task_id]->duration_code); + + tdd1->StartTime = start_time; + + Ptr = (char *) tdd1 + sizeof(TaskDescriptionData1_Struct); + + sprintf(Ptr, "%s", p_task_data[task_id]->description.c_str()); + Ptr += p_task_data[task_id]->description.length() + 1; + + tdd2 = (TaskDescriptionData2_Struct *) Ptr; + + // we have this reward stuff! + // if we ever don't hardcode this, TaskDescriptionTrailer_Struct will need to be fixed since + // "has_reward_selection" is after this bool! Smaller packet when this is 0 + tdd2->has_rewards = 1; + + tdd2->coin_reward = p_task_data[task_id]->cash_reward; + tdd2->xp_reward = p_task_data[task_id]->experience_reward ? 1 : 0; // just booled + tdd2->faction_reward = p_task_data[task_id]->faction_reward ? 1 : 0; // faction booled + + Ptr = (char *) tdd2 + sizeof(TaskDescriptionData2_Struct); + + // we actually have 2 strings here. One is max length 96 and not parsed for item links + // We actually skipped past that string incorrectly before, so TODO: fix item link string + sprintf(Ptr, "%s", p_task_data[task_id]->reward.c_str()); + Ptr += p_task_data[task_id]->reward.length() + 1; + + // second string is parsed for item links + sprintf(Ptr, "%s", p_task_data[task_id]->item_link.c_str()); + Ptr += p_task_data[task_id]->item_link.length() + 1; + + tdt = (TaskDescriptionTrailer_Struct *) Ptr; + tdt->Points = 0x00000000; // Points Count TODO: this does have a visible affect on the client ... + tdt->has_reward_selection = 0; // TODO: new rewards window + + client->QueuePacket(outapp); + safe_delete(outapp); +} + +bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_state) +{ + if (!client || !client_task_state) { + return false; + } + + int character_id = client->CharacterID(); + + client_task_state->active_task_count = 0; + + LogTasks("[LoadClientState] for character_id [{}]", character_id); + + auto character_tasks = CharacterTasksRepository::GetWhere( + database, + fmt::format("charid = {} ORDER BY acceptedtime", character_id) + ); + + for (auto &character_task: character_tasks) { + int task_id = character_task.taskid; + int slot = character_task.slot; + auto type = static_cast(character_task.type); + + if ((task_id < 0) || (task_id >= MAXTASKS)) { + LogTasks("[LoadClientState] Error: task_id [{}] out of range while loading character tasks from database", + task_id); + continue; + } + + auto task_info = client_task_state->GetClientTaskInfo(type, slot); + + if (task_info == nullptr) { + LogTasks("[LoadClientState] Error: slot [{}] out of range while loading character tasks from database", + slot); + continue; + } + + if (task_info->task_id != TASKSLOTEMPTY) { + LogTasks("[LoadClientState] Error: slot [{}] for task [{}] is already occupied", slot, task_id); + continue; + } + + task_info->task_id = task_id; + task_info->current_step = -1; + task_info->accepted_time = character_task.acceptedtime; + task_info->updated = false; + + for (auto &i : task_info->activity) { + i.activity_id = -1; + } + + if (type == TaskType::Quest) { + ++client_task_state->active_task_count; + } + + LogTasks( + "[LoadClientState] character_id [{}] task_id [{}] accepted_time [{}]", + character_id, + task_id, + character_task.acceptedtime + ); + } + + // Load Activities + LogTasks("[LoadClientState] Loading activities for character_id [{}]", character_id); + + auto character_activities = CharacterActivitiesRepository::GetWhere( + database, + fmt::format("charid = {} ORDER BY `taskid` ASC, `activityid` ASC", character_id) + ); + + for (auto &character_activity: character_activities) { + int task_id = character_activity.taskid; + if ((task_id < 0) || (task_id >= MAXTASKS)) { + LogTasks( + "[LoadClientState] Error: task_id [{}] out of range while loading character activities from database character_id [{}]", + task_id, + character_id + ); + continue; + } + + int activity_id = character_activity.activityid; + if ((activity_id < 0) || (activity_id >= MAXACTIVITIESPERTASK)) { + LogTasks( + "[LoadClientState] Error: activity_id [{}] out of range while loading character activities from database character_id [{}]", + activity_id, + character_id + ); + + continue; + } + + ClientTaskInformation *task_info = nullptr; + if (client_task_state->active_task.task_id == task_id) { + task_info = &client_task_state->active_task; + } + + // wasn't task + if (task_info == nullptr) { + for (auto &active_quest : client_task_state->active_quests) { + if (active_quest.task_id == task_id) { + task_info = &active_quest; + } + } + } + + if (task_info == nullptr) { + LogTasks( + "[LoadClientState] Error: activity_id [{}] found for task_id [{}] which client does not have character_id [{}]", + activity_id, + task_id, + character_id + ); + + continue; + } + + task_info->activity[activity_id].activity_id = activity_id; + task_info->activity[activity_id].done_count = character_activity.donecount; + if (character_activity.completed) { + task_info->activity[activity_id].activity_state = ActivityCompleted; + } + else { + task_info->activity[activity_id].activity_state = ActivityHidden; + } + + task_info->activity[activity_id].updated = false; + + LogTasks( + "[LoadClientState] character_id [{}] task_id [{}] activity_id [{}] done_count [{}] completed [{}]", + character_id, + task_id, + activity_id, + character_activity.donecount, + character_activity.completed + ); + } + + if (RuleB(TaskSystem, RecordCompletedTasks)) { + CompletedTaskInformation completed_task_information{}; + + for (bool &i : completed_task_information.activity_done) { + i = false; + } + + int previous_task_id = -1; + int previous_completed_time = -1; + + auto character_completed_tasks = CompletedTasksRepository::GetWhere( + database, + fmt::format("charid = {} ORDER BY completedtime, taskid, activityid", character_id) + ); + + for (auto &character_completed_task: character_completed_tasks) { + int task_id = character_completed_task.taskid; + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + LogError("[TASKS]Task ID [{}] out of range while loading completed tasks from database", task_id); + continue; + } + + // An activity_id of -1 means mark all the none optional activities in the + // task as complete. If the Rule to record optional activities is enabled, + // subsequent records for this task will flag any optional tasks that were + // completed. + int activity_id = character_completed_task.activityid; + if ((activity_id < -1) || (activity_id >= MAXACTIVITIESPERTASK)) { + LogError("[TASKS]activity_information ID [{}] out of range while loading completed tasks from database", + activity_id); + continue; + } + + int completed_time = character_completed_task.completedtime; + if ((previous_task_id != -1) && + ((task_id != previous_task_id) || (completed_time != previous_completed_time))) { + client_task_state->completed_tasks.push_back(completed_task_information); + for (bool &activity_done : completed_task_information.activity_done) { + activity_done = false; + } + } + + completed_task_information.task_id = previous_task_id = task_id; + completed_task_information.completed_time = previous_completed_time = completed_time; + + // If activity_id is -1, Mark all the non-optional tasks as completed. + if (activity_id < 0) { + TaskInformation *task = p_task_data[task_id]; + if (task == nullptr) { + continue; + } + + for (int i = 0; i < task->activity_count; i++) { + if (!task->activity_information[i].optional) { + completed_task_information.activity_done[i] = true; + } + } + } + else { + completed_task_information.activity_done[activity_id] = true; + } + } + + if (previous_task_id != -1) { + client_task_state->completed_tasks.push_back(completed_task_information); + } + + client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); + } + + std::string query = StringFormat( + "SELECT `taskid` FROM character_enabledtasks " + "WHERE `charid` = %i AND `taskid` >0 AND `taskid` < %i " + "ORDER BY `taskid` ASC", + character_id, MAXTASKS + ); + + auto results = database.QueryDatabase(query); + if (results.Success()) { + for (auto row = results.begin(); row != results.end(); ++row) { + int task_id = atoi(row[0]); + client_task_state->enabled_tasks.push_back(task_id); + LogTasksDetail("[LoadClientState] Adding task_id [{}] to enabled tasks", task_id); + } + } + + // Check that there is an entry in the client task state for every activity_information in each task + // This should only break if a ServerOP adds or deletes activites for a task that players already + // have active, or due to a bug. + for (int task_index = 0; task_index < MAXACTIVEQUESTS + 1; task_index++) { + int task_id = client_task_state->active_tasks[task_index].task_id; + if (task_id == TASKSLOTEMPTY) { + continue; + } + if (!p_task_data[task_id]) { + client->Message( + Chat::Red, + "Active Task Slot %i, references a task (%i), that does not exist. " + "Removing from memory. Contact a GM to resolve this.", + task_index, + task_id + ); + + LogError("[LoadClientState] Character [{}] has task [{}] which does not exist", character_id, task_id); + client_task_state->active_tasks[task_index].task_id = TASKSLOTEMPTY; + continue; + } + for (int activity_index = 0; activity_index < p_task_data[task_id]->activity_count; activity_index++) { + if (client_task_state->active_tasks[task_index].activity[activity_index].activity_id != activity_index) { + client->Message( + Chat::Red, + "Active Task %i, %s. activity_information count does not match expected value." + "Removing from memory. Contact a GM to resolve this.", + task_id, p_task_data[task_id]->title.c_str() + ); + + LogTasks( + "[LoadClientState] Fatal error in character [{}] task state. activity_information [{}] for Task [{}] either missing from client state or from task", + character_id, + activity_index, + task_id + ); + client_task_state->active_tasks[task_index].task_id = TASKSLOTEMPTY; + break; + } + } + } + + if (client_task_state->active_task.task_id != TASKSLOTEMPTY) { + client_task_state->UnlockActivities(character_id, client_task_state->active_task); + } + + // TODO: shared + for (auto &active_quest : client_task_state->active_quests) { + if (active_quest.task_id != TASKSLOTEMPTY) { + client_task_state->UnlockActivities(character_id, active_quest); + } + } + + LogTasks("[LoadClientState] for Character ID [{}] DONE!", character_id); + + return true; +} \ No newline at end of file diff --git a/zone/task_manager.h b/zone/task_manager.h new file mode 100644 index 000000000..bfbb02056 --- /dev/null +++ b/zone/task_manager.h @@ -0,0 +1,97 @@ +#ifndef EQEMU_TASK_MANAGER_H +#define EQEMU_TASK_MANAGER_H + +#include "tasks.h" +#include "task_client_state.h" +#include "task_proximity_manager.h" +#include "task_goal_list_manager.h" +#include "../common/types.h" +#include +#include +#include +#include + +class Client; +class Mob; + +class TaskManager { + +public: + TaskManager(); + ~TaskManager(); + int GetActivityCount(int task_id); + bool LoadTasks(int single_task = 0); + void ReloadGoalLists(); + inline void LoadProximities(int zone_id) + { + proximity_manager.LoadProximities(zone_id); + } + bool LoadTaskSets(); + bool LoadClientState(Client *client, ClientTaskState *client_task_state); + bool SaveClientState(Client *client, ClientTaskState *client_task_state); + void SendTaskSelector(Client *client, Mob *mob, int task_count, int *task_list); + void SendTaskSelectorNew(Client *client, Mob *mob, int task_count, int *task_list); + bool ValidateLevel(int task_id, int player_level); + std::string GetTaskName(uint32 task_id); + TaskType GetTaskType(uint32 task_id); + void TaskSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int task_set_id); + // task list provided by QuestManager (perl/lua) + void TaskQuestSetSelector( + Client *client, + ClientTaskState *client_task_state, + Mob *mob, + int count, + int *tasks + ); + void SendActiveTasksToClient(Client *client, bool task_complete = false); + void SendSingleActiveTaskToClient( + Client *client, + ClientTaskInformation &task_info, + bool task_complete, + bool bring_up_task_journal = false + ); + void SendTaskActivityShort(Client *client, int task_id, int activity_id, int client_task_index); + void SendTaskActivityLong( + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete = false + ); + void SendTaskActivityNew( + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete = false + ); + void SendCompletedTasksToClient(Client *c, ClientTaskState *client_task_state); + void ExplainTask(Client *client, int task_id); + int FirstTaskInSet(int task_set); + int LastTaskInSet(int task_set); + int NextTaskInSet(int task_set, int task_id); + bool IsTaskRepeatable(int task_id); + + friend class ClientTaskState; + + +private: + TaskGoalListManager goal_list_manager; + TaskProximityManager proximity_manager; + TaskInformation *p_task_data[MAXTASKS]{}; + std::vector task_sets[MAXTASKSETS]; + void SendActiveTaskDescription( + Client *client, + int task_id, + ClientTaskInformation &task_info, + int start_time, + int duration, + bool bring_up_task_journal = false + ); + +}; + + +#endif //EQEMU_TASK_MANAGER_H diff --git a/zone/task_proximity_manager.cpp b/zone/task_proximity_manager.cpp new file mode 100644 index 000000000..615794c38 --- /dev/null +++ b/zone/task_proximity_manager.cpp @@ -0,0 +1,80 @@ +#include "../common/global_define.h" +#include "../common/repositories/proximities_repository.h" +#include "../common/rulesys.h" +#include "client.h" +#include "mob.h" +#include "quest_parser_collection.h" +#include "task_proximity_manager.h" +#include "tasks.h" +#include "zonedb.h" + +TaskProximityManager::TaskProximityManager() +{ + + +} + +TaskProximityManager::~TaskProximityManager() +{ + + +} + +bool TaskProximityManager::LoadProximities(int zone_id) +{ + TaskProximity proximity{}; + task_proximities.clear(); + + auto proximities = ProximitiesRepository::GetWhere( + content_db, + fmt::format("zoneid = {} ORDER BY `zoneid` ASC", zone_id) + ); + + for (auto &row: proximities) { + proximity.explore_id = row.exploreid; + proximity.min_x = row.minx; + proximity.max_x = row.maxx; + proximity.min_y = row.miny; + proximity.max_y = row.maxy; + proximity.min_z = row.minz; + proximity.max_z = row.maxz; + + task_proximities.push_back(proximity); + } + + LogTasks("Loaded [{}] Task Proximities", proximities.size()); + + return true; +} + +int TaskProximityManager::CheckProximities(float x, float y, float z) +{ + for (auto &task_proximity : task_proximities) { + + TaskProximity *p_proximity = &task_proximity; + + Log( + Logs::General, + Logs::Tasks, + "[Proximity] Checking %8.3f, %8.3f, %8.3f against %8.3f, %8.3f, %8.3f, %8.3f, %8.3f, %8.3f", + x, + y, + z, + p_proximity->min_x, + p_proximity->max_x, + p_proximity->min_y, + p_proximity->max_y, + p_proximity->min_z, + p_proximity->max_z + ); + + if (x < p_proximity->min_x || x > p_proximity->max_x || y < p_proximity->min_y || y > p_proximity->max_y || + z < p_proximity->min_z || z > p_proximity->max_z) { + continue; + } + + return p_proximity->explore_id; + } + + return 0; +} diff --git a/zone/task_proximity_manager.h b/zone/task_proximity_manager.h new file mode 100644 index 000000000..05a367c32 --- /dev/null +++ b/zone/task_proximity_manager.h @@ -0,0 +1,27 @@ +#ifndef EQEMU_TASK_PROXIMITY_MANAGER_H +#define EQEMU_TASK_PROXIMITY_MANAGER_H + +struct TaskProximity { + int explore_id; + float min_x; + float max_x; + float min_y; + float max_y; + float min_z; + float max_z; +}; + +// This class is used for managing proximities so that Quest NPC proximities don't need to be used. +class TaskProximityManager { + +public: + TaskProximityManager(); + ~TaskProximityManager(); + bool LoadProximities(int zone_id); + int CheckProximities(float x, float y, float z); + +private: + std::vector task_proximities; +}; + +#endif //EQEMU_TASK_PROXIMITY_MANAGER_H diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 1faf636b0..c1c4cbceb 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -1,476 +1,15 @@ - -/* EQEMu: Everquest Server Emulator -Copyright (C) 2001-2008 EQEMu Development Team (http://eqemulator.net) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY except by those people which sell it, which - are required to give you total support for your newly bought product; - without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - #include "../common/global_define.h" -#include "tasks.h" - -#include - -#ifdef _WINDOWS -#define strcasecmp _stricmp -#endif - #include "../common/misc_functions.h" #include "../common/rulesys.h" #include "../common/string_util.h" -#include "../common/say_link.h" -#include "zonedb.h" -#include "../common/repositories/goallists_repository.h" #include "client.h" -#include "mob.h" -#include "string_ids.h" - #include "queryserv.h" #include "quest_parser_collection.h" -#include "../common/repositories/completed_tasks_repository.h" -#include "../common/repositories/tasksets_repository.h" -#include "../common/repositories/tasks_repository.h" -#include "../common/repositories/task_activities_repository.h" -#include "../common/repositories/character_activities_repository.h" -#include "../common/repositories/character_tasks_repository.h" -#include "../common/repositories/proximities_repository.h" +#include "tasks.h" +#include "zonedb.h" extern QueryServ *QServ; -TaskManager::TaskManager() -{ - for (auto &task : p_task_data) { - task = nullptr; - } -} - -TaskManager::~TaskManager() -{ - for (auto &task : p_task_data) { - if (task != nullptr) { - safe_delete(task); - } - } -} - -bool TaskManager::LoadTaskSets() -{ - // Clear all task sets in memory. Done so we can reload them on the fly if required by just calling - // this method again. - for (auto &task_set : task_sets) { - task_set.clear(); - } - - auto rows = TasksetsRepository::GetWhere( - content_db, - fmt::format( - "`id` > 0 AND `id` < {} AND `taskid` >= 0 AND `taskid` < {} ORDER BY `id`, `taskid` ASC", - MAXTASKSETS, - MAXTASKS - ) - ); - - for (auto &task_set: rows) { - task_sets[task_set.id].push_back(task_set.taskid); - LogTasksDetail("[LoadTaskSets] Adding task_id [{}] to task_set [{}]", task_set.taskid, task_set.id); - } - - return true; -} - -void TaskManager::ReloadGoalLists() -{ - if (!goal_list_manager.LoadLists()) { - Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadLists failed"); - } -} - -bool TaskManager::LoadTasks(int single_task) -{ - std::string task_query_filter = fmt::format("id = {}", single_task); - std::string query; - if (single_task == 0) { - if (!goal_list_manager.LoadLists()) { - LogTasks("[TaskManager::LoadTasks] LoadLists failed"); - } - - if (!LoadTaskSets()) { - LogTasks("[TaskManager::LoadTasks] LoadTaskSets failed"); - } - - task_query_filter = fmt::format("id < {}", MAXTASKS); - } - - // load task level data - auto repo_tasks = TasksRepository::GetWhere(content_db, task_query_filter); - - for (auto &task: repo_tasks) { - int task_id = task.id; - - if ((task_id <= 0) || (task_id >= MAXTASKS)) { - // This shouldn't happen, as the SELECT is bounded by MAXTASKS - LogError("[TASKS]Task ID [{}] out of range while loading tasks from database", task_id); - continue; - } - - // load task data - p_task_data[task_id] = new TaskInformation; - p_task_data[task_id]->type = static_cast(task.type); - p_task_data[task_id]->duration = task.duration; - p_task_data[task_id]->duration_code = static_cast(task.duration_code); - p_task_data[task_id]->title = task.title; - p_task_data[task_id]->description = task.description; - p_task_data[task_id]->reward = task.reward; - p_task_data[task_id]->reward_id = task.rewardid; - p_task_data[task_id]->cash_reward = task.cashreward; - p_task_data[task_id]->experience_reward = task.xpreward; - p_task_data[task_id]->reward_method = (TaskMethodType) task.rewardmethod; - p_task_data[task_id]->faction_reward = task.faction_reward; - p_task_data[task_id]->min_level = task.minlevel; - p_task_data[task_id]->max_level = task.maxlevel; - p_task_data[task_id]->repeatable = task.repeatable; - p_task_data[task_id]->completion_emote = task.completion_emote; - p_task_data[task_id]->activity_count = 0; - p_task_data[task_id]->sequence_mode = ActivitiesSequential; - p_task_data[task_id]->last_step = 0; - - LogTasksDetail( - "[LoadTasks] (Task) task_id [{}] type [{}] duration [{}] duration_code [{}] title [{}] description [{}] " - " reward [{}] rewardid [{}] cashreward [{}] xpreward [{}] rewardmethod [{}] faction_reward [{}] minlevel [{}] " - " maxlevel [{}] repeatable [{}] completion_emote [{}] ", - task.id, - task.type, - task.duration, - task.duration_code, - task.title, - task.description, - task.reward, - task.rewardid, - task.cashreward, - task.xpreward, - task.rewardmethod, - task.faction_reward, - task.minlevel, - task.maxlevel, - task.repeatable, - task.completion_emote - ); - } - - LogTasks("Loaded [{}] Tasks", repo_tasks.size()); - - std::string activities_query_filter = fmt::format( - "taskid = {} and activityid < {} ORDER BY taskid, activityid ASC", - single_task, - MAXACTIVITIESPERTASK - ); - - // if loading only a single task - if (single_task == 0) { - activities_query_filter = fmt::format( - "taskid < {} and activityid < {} ORDER BY taskid, activityid ASC", - MAXTASKS, - MAXACTIVITIESPERTASK - ); - } - - // load activity data - auto task_activities = TaskActivitiesRepository::GetWhere(content_db, activities_query_filter); - for (auto &task_activity: task_activities) { - int task_id = task_activity.taskid; - int step = task_activity.step; - int activity_id = task_activity.activityid; - - // create pointer to activity data since declarations get unruly long - int activity_index = p_task_data[task_id]->activity_count; - ActivityInformation *p_activity_data = &p_task_data[task_id]->activity_information[activity_index]; - - if ((task_id <= 0) || (task_id >= MAXTASKS) || (activity_id < 0) || (activity_id >= MAXACTIVITIESPERTASK)) { - - // This shouldn't happen, as the SELECT is bounded by MAXTASKS - LogTasks( - "Error: Task or activity_information ID ([{}], [{}]) out of range while loading activities from database", - task_id, - activity_id - ); - continue; - } - - if (p_task_data[task_id] == nullptr) { - LogTasks( - "Error: activity_information for non-existent task ([{}], [{}]) while loading activities from database", - task_id, - activity_id - ); - continue; - } - - p_task_data[task_id]->activity_information[p_task_data[task_id]->activity_count].step_number = step; - - if (step != 0) { - p_task_data[task_id]->sequence_mode = ActivitiesStepped; - } - - if (step > p_task_data[task_id]->last_step) { - p_task_data[task_id]->last_step = step; - } - - // Task Activities MUST be numbered sequentially from 0. If not, log an error - // and set the task to nullptr. Subsequent activities for this task will raise - // ERR_NOTASK errors. - // Change to (activityID != (Tasks[taskID]->activity_count + 1)) to index from 1 - if (activity_id != p_task_data[task_id]->activity_count) { - LogError("[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", - task_id, - activity_id); - p_task_data[task_id] = nullptr; - continue; - } - - // set activity data - p_activity_data->activity_type = task_activity.activitytype; - p_activity_data->target_name = task_activity.target_name; - p_activity_data->item_list = task_activity.item_list; - p_activity_data->skill_list = task_activity.skill_list; - p_activity_data->skill_id = std::stoi(task_activity.skill_list); // for older clients - p_activity_data->spell_list = task_activity.spell_list; - p_activity_data->spell_id = std::stoi(task_activity.spell_list); // for older clients - p_activity_data->description_override = task_activity.description_override; - p_activity_data->goal_id = task_activity.goalid; - p_activity_data->goal_method = (TaskMethodType) task_activity.goalmethod; - p_activity_data->goal_count = task_activity.goalcount; - p_activity_data->deliver_to_npc = task_activity.delivertonpc; - - // zones - p_activity_data->zones = task_activity.zones; - auto zones = SplitString( - task_activity.zones, - ';' - ); - - for (auto &&e : zones) { - p_activity_data->zone_ids.push_back(std::stoi(e)); - } - - p_activity_data->optional = task_activity.optional; - - LogTasksDetail( - "[LoadTasks] (Activity) task_id [{}] activity_id [{}] slot [{}] activity_type [{}] goal_id [{}] goal_method [{}] goal_count [{}] zones [{}]" - " target_name [{}] item_list [{}] skill_list [{}] spell_list [{}] description_override [{}]", - task_id, - activity_id, - p_task_data[task_id]->activity_count, - p_activity_data->activity_type, - p_activity_data->goal_id, - p_activity_data->goal_method, - p_activity_data->goal_count, - p_activity_data->zones.c_str(), - p_activity_data->target_name.c_str(), - p_activity_data->item_list.c_str(), - p_activity_data->skill_list.c_str(), - p_activity_data->spell_list.c_str(), - p_activity_data->description_override.c_str() - ); - - p_task_data[task_id]->activity_count++; - } - - LogTasks("Loaded [{}] Task Activities", task_activities.size()); - - return true; -} - -bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_state) -{ - // I am saving the slot in the ActiveTasks table, because unless a Task is cancelled/completed, the client - // doesn't seem to like tasks moving slots between zoning and you can end up with 'bogus' activities if the task - // previously in that slot had more activities than the one now occupying it. Hopefully retaining the slot - // number for the duration of a session will overcome this. - if (!client || !client_task_state) { - return false; - } - - const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::SaveClientState %s"; - - int character_id = client->CharacterID(); - - LogTasks("[SaveClientState] character_id [{}]", character_id); - - if (client_task_state->active_task_count > 0 || - client_task_state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks - for (auto &active_task : client_task_state->active_tasks) { - int task_id = active_task.task_id; - if (task_id == TASKSLOTEMPTY) { - continue; - } - - int slot = active_task.slot; - if (active_task.updated) { - - LogTasks( - "[SaveClientState] character_id [{}] updating task_index [{}] task_id [{}]", - character_id, - slot, - task_id - ); - - std::string query = StringFormat( - "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime) " - "VALUES (%i, %i, %i, %i, %i)", - character_id, - task_id, - slot, - static_cast(p_task_data[task_id]->type), - active_task.accepted_time - ); - - auto results = database.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - } - else { - active_task.updated = false; - } - } - - std::string query = - "REPLACE INTO character_activities (charid, taskid, activityid, donecount, completed) " - "VALUES "; - - int updated_activity_count = 0; - - for (int activity_index = 0; activity_index < p_task_data[task_id]->activity_count; ++activity_index) { - if (!active_task.activity[activity_index].updated) { - continue; - } - - LogTasks( - "[SaveClientState] Updating activity character_id [{}] updating task_index [{}] task_id [{}] activity_index [{}]", - character_id, - slot, - task_id, - activity_index - ); - - if (updated_activity_count == 0) { - query += - StringFormat( - "(%i, %i, %i, %i, %i)", character_id, task_id, activity_index, - active_task.activity[activity_index].done_count, - active_task.activity[activity_index].activity_state == - ActivityCompleted - ); - } - else { - query += - StringFormat( - ", (%i, %i, %i, %i, %i)", character_id, task_id, activity_index, - active_task.activity[activity_index].done_count, - active_task.activity[activity_index].activity_state == - ActivityCompleted - ); - } - - updated_activity_count++; - } - - if (updated_activity_count == 0) { - continue; - } - - auto results = database.QueryDatabase(query); - - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - continue; - } - - active_task.updated = false; - for (int activity_index = 0; - activity_index < p_task_data[task_id]->activity_count; - ++activity_index) - active_task.activity[activity_index].updated = false; - } - } - - if (!RuleB(TaskSystem, RecordCompletedTasks) || - (client_task_state->completed_tasks.size() <= (unsigned int) client_task_state->last_completed_task_loaded)) { - client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); - return true; - } - - const char *completed_task_query = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " - "VALUES (%i, %i, %i, %i)"; - - for (unsigned int task_index = client_task_state->last_completed_task_loaded; - task_index < client_task_state->completed_tasks.size(); - task_index++) { - - int task_id = client_task_state->completed_tasks[task_index].task_id; - - if ((task_id <= 0) || (task_id >= MAXTASKS) || (p_task_data[task_id] == nullptr)) { - continue; - } - - // First we save a record with an activity_id of -1. - // This indicates this task was completed at the given time. We infer that all - // none optional activities were completed. - // - std::string query = StringFormat( - completed_task_query, - character_id, - client_task_state->completed_tasks[task_index].completed_time, - task_id, - -1 - ); - - auto results = database.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - continue; - } - - // If the Rule to record non-optional task completion is not enabled, don't save it - if (!RuleB(TaskSystem, RecordCompletedOptionalActivities)) { - continue; - } - - // Insert one record for each completed optional task. - for (int activity_id = 0; activity_id < p_task_data[task_id]->activity_count; activity_id++) { - if (!p_task_data[task_id]->activity_information[activity_id].optional || - !client_task_state->completed_tasks[task_index].activity_done[activity_id]) { - continue; - } - - query = StringFormat( - completed_task_query, - character_id, - client_task_state->completed_tasks[task_index].completed_time, - task_id, activity_id - ); - - results = database.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - } - } - } - - client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); - return true; -} - void Client::LoadClientTaskState() { if (RuleB(TaskSystem, EnableTaskSystem) && p_task_manager) { @@ -497,2378 +36,6 @@ void Client::RemoveClientTaskState() } } -bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_state) -{ - if (!client || !client_task_state) { - return false; - } - - int character_id = client->CharacterID(); - - client_task_state->active_task_count = 0; - - LogTasks("[LoadClientState] for character_id [{}]", character_id); - - auto character_tasks = CharacterTasksRepository::GetWhere( - database, - fmt::format("charid = {} ORDER BY acceptedtime", character_id) - ); - - for (auto &character_task: character_tasks) { - int task_id = character_task.taskid; - int slot = character_task.slot; - auto type = static_cast(character_task.type); - - if ((task_id < 0) || (task_id >= MAXTASKS)) { - LogTasks("[LoadClientState] Error: task_id [{}] out of range while loading character tasks from database", - task_id); - continue; - } - - auto task_info = client_task_state->GetClientTaskInfo(type, slot); - - if (task_info == nullptr) { - LogTasks("[LoadClientState] Error: slot [{}] out of range while loading character tasks from database", - slot); - continue; - } - - if (task_info->task_id != TASKSLOTEMPTY) { - LogTasks("[LoadClientState] Error: slot [{}] for task [{}] is already occupied", slot, task_id); - continue; - } - - task_info->task_id = task_id; - task_info->current_step = -1; - task_info->accepted_time = character_task.acceptedtime; - task_info->updated = false; - - for (auto &i : task_info->activity) { - i.activity_id = -1; - } - - if (type == TaskType::Quest) { - ++client_task_state->active_task_count; - } - - LogTasks( - "[LoadClientState] character_id [{}] task_id [{}] accepted_time [{}]", - character_id, - task_id, - character_task.acceptedtime - ); - } - - // Load Activities - LogTasks("[LoadClientState] Loading activities for character_id [{}]", character_id); - - auto character_activities = CharacterActivitiesRepository::GetWhere( - database, - fmt::format("charid = {} ORDER BY `taskid` ASC, `activityid` ASC", character_id) - ); - - for (auto &character_activity: character_activities) { - int task_id = character_activity.taskid; - if ((task_id < 0) || (task_id >= MAXTASKS)) { - LogTasks( - "[LoadClientState] Error: task_id [{}] out of range while loading character activities from database character_id [{}]", - task_id, - character_id - ); - continue; - } - - int activity_id = character_activity.activityid; - if ((activity_id < 0) || (activity_id >= MAXACTIVITIESPERTASK)) { - LogTasks( - "[LoadClientState] Error: activity_id [{}] out of range while loading character activities from database character_id [{}]", - activity_id, - character_id - ); - - continue; - } - - ClientTaskInformation *task_info = nullptr; - if (client_task_state->active_task.task_id == task_id) { - task_info = &client_task_state->active_task; - } - - // wasn't task - if (task_info == nullptr) { - for (auto &active_quest : client_task_state->active_quests) { - if (active_quest.task_id == task_id) { - task_info = &active_quest; - } - } - } - - if (task_info == nullptr) { - LogTasks( - "[LoadClientState] Error: activity_id [{}] found for task_id [{}] which client does not have character_id [{}]", - activity_id, - task_id, - character_id - ); - - continue; - } - - task_info->activity[activity_id].activity_id = activity_id; - task_info->activity[activity_id].done_count = character_activity.donecount; - if (character_activity.completed) { - task_info->activity[activity_id].activity_state = ActivityCompleted; - } - else { - task_info->activity[activity_id].activity_state = ActivityHidden; - } - - task_info->activity[activity_id].updated = false; - - LogTasks( - "[LoadClientState] character_id [{}] task_id [{}] activity_id [{}] done_count [{}] completed [{}]", - character_id, - task_id, - activity_id, - character_activity.donecount, - character_activity.completed - ); - } - - if (RuleB(TaskSystem, RecordCompletedTasks)) { - CompletedTaskInformation completed_task_information{}; - - for (bool &i : completed_task_information.activity_done) { - i = false; - } - - int previous_task_id = -1; - int previous_completed_time = -1; - - auto character_completed_tasks = CompletedTasksRepository::GetWhere( - database, - fmt::format("charid = {} ORDER BY completedtime, taskid, activityid", character_id) - ); - - for (auto &character_completed_task: character_completed_tasks) { - int task_id = character_completed_task.taskid; - if ((task_id <= 0) || (task_id >= MAXTASKS)) { - LogError("[TASKS]Task ID [{}] out of range while loading completed tasks from database", task_id); - continue; - } - - // An activity_id of -1 means mark all the none optional activities in the - // task as complete. If the Rule to record optional activities is enabled, - // subsequent records for this task will flag any optional tasks that were - // completed. - int activity_id = character_completed_task.activityid; - if ((activity_id < -1) || (activity_id >= MAXACTIVITIESPERTASK)) { - LogError("[TASKS]activity_information ID [{}] out of range while loading completed tasks from database", - activity_id); - continue; - } - - int completed_time = character_completed_task.completedtime; - if ((previous_task_id != -1) && - ((task_id != previous_task_id) || (completed_time != previous_completed_time))) { - client_task_state->completed_tasks.push_back(completed_task_information); - for (bool &activity_done : completed_task_information.activity_done) { - activity_done = false; - } - } - - completed_task_information.task_id = previous_task_id = task_id; - completed_task_information.completed_time = previous_completed_time = completed_time; - - // If activity_id is -1, Mark all the non-optional tasks as completed. - if (activity_id < 0) { - TaskInformation *task = p_task_data[task_id]; - if (task == nullptr) { - continue; - } - - for (int i = 0; i < task->activity_count; i++) { - if (!task->activity_information[i].optional) { - completed_task_information.activity_done[i] = true; - } - } - } - else { - completed_task_information.activity_done[activity_id] = true; - } - } - - if (previous_task_id != -1) { - client_task_state->completed_tasks.push_back(completed_task_information); - } - - client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); - } - - std::string query = StringFormat( - "SELECT `taskid` FROM character_enabledtasks " - "WHERE `charid` = %i AND `taskid` >0 AND `taskid` < %i " - "ORDER BY `taskid` ASC", - character_id, MAXTASKS - ); - auto results = database.QueryDatabase(query); - if (results.Success()) { - for (auto row = results.begin(); row != results.end(); ++row) { - int task_id = atoi(row[0]); - client_task_state->enabled_tasks.push_back(task_id); - LogTasksDetail("[LoadClientState] Adding task_id [{}] to enabled tasks", task_id); - } - } - - // Check that there is an entry in the client task state for every activity_information in each task - // This should only break if a ServerOP adds or deletes activites for a task that players already - // have active, or due to a bug. - for (int task_index = 0; task_index < MAXACTIVEQUESTS + 1; task_index++) { - int task_id = client_task_state->active_tasks[task_index].task_id; - if (task_id == TASKSLOTEMPTY) { - continue; - } - if (!p_task_data[task_id]) { - client->Message( - Chat::Red, - "Active Task Slot %i, references a task (%i), that does not exist. " - "Removing from memory. Contact a GM to resolve this.", - task_index, - task_id - ); - - LogError("[LoadClientState] Character [{}] has task [{}] which does not exist", character_id, task_id); - client_task_state->active_tasks[task_index].task_id = TASKSLOTEMPTY; - continue; - } - for (int activity_index = 0; activity_index < p_task_data[task_id]->activity_count; activity_index++) { - if (client_task_state->active_tasks[task_index].activity[activity_index].activity_id != activity_index) { - client->Message( - Chat::Red, - "Active Task %i, %s. activity_information count does not match expected value." - "Removing from memory. Contact a GM to resolve this.", - task_id, p_task_data[task_id]->title.c_str() - ); - - LogTasks( - "[LoadClientState] Fatal error in character [{}] task state. activity_information [{}] for Task [{}] either missing from client state or from task", - character_id, - activity_index, - task_id - ); - client_task_state->active_tasks[task_index].task_id = TASKSLOTEMPTY; - break; - } - } - } - - if (client_task_state->active_task.task_id != TASKSLOTEMPTY) { - client_task_state->UnlockActivities(character_id, client_task_state->active_task); - } - - // TODO: shared - for (auto &active_quest : client_task_state->active_quests) { - if (active_quest.task_id != TASKSLOTEMPTY) { - client_task_state->UnlockActivities(character_id, active_quest); - } - } - - LogTasks("[LoadClientState] for Character ID [{}] DONE!", character_id); - - return true; -} - -void ClientTaskState::EnableTask(int character_id, int task_count, int *task_list) -{ - // Check if the Task is already enabled for this client - std::vector tasks_enabled; - for (int i = 0; i < task_count; i++) { - - auto iterator = enabled_tasks.begin(); - bool add_task = true; - - while (iterator != enabled_tasks.end()) { - // If this task is already enabled, stop looking - if ((*iterator) == task_list[i]) { - add_task = false; - break; - } - // Our list of enabled tasks is sorted, so we can quit if we find a taskid higher than - // the one we are looking for. - if ((*iterator) > task_list[i]) { - break; - } - ++iterator; - } - - if (add_task) { - enabled_tasks.insert(iterator, task_list[i]); - // Make a note of the task we enabled, for later SQL generation - tasks_enabled.push_back(task_list[i]); - } - } - - LogTasksDetail("[EnableTask] New enabled task list"); - for (int enabled_task : enabled_tasks) { - LogTasksDetail("[EnableTask] enabled [{}] character_id [{}]", enabled_task, character_id); - } - - if (tasks_enabled.empty()) { - return; - } - - std::stringstream query_stream; - query_stream << "REPLACE INTO character_enabledtasks (charid, taskid) VALUES "; - for (unsigned int i = 0; i < tasks_enabled.size(); i++) { - query_stream << (i ? ", " : "") << StringFormat("(%i, %i)", character_id, tasks_enabled[i]); - } - - std::string query = query_stream.str(); - if (!tasks_enabled.empty()) { - database.QueryDatabase(query); - } - else { - LogTasks("[EnableTask] Called for character_id [{}] but, no tasks exist", character_id); - } -} - -void ClientTaskState::DisableTask(int character_id, int task_count, int *task_list) -{ - - // Check if the Task is enabled for this client - std::vector tasks_disabled; - - for (int i = 0; i < task_count; i++) { - auto iterator = enabled_tasks.begin(); - bool removeTask = false; - - while (iterator != enabled_tasks.end()) { - if ((*iterator) == task_list[i]) { - removeTask = true; - break; - } - - if ((*iterator) > task_list[i]) { - break; - } - - ++iterator; - } - - if (removeTask) { - enabled_tasks.erase(iterator); - tasks_disabled.push_back(task_list[i]); - } - } - - LogTasks("[DisableTask] New enabled task list "); - for (int enabled_task : enabled_tasks) { - LogTasks("[DisableTask] enabled_tasks [{}]", enabled_task); - } - - if (tasks_disabled.empty()) { - return; - } - - std::stringstream queryStream; - queryStream << StringFormat("DELETE FROM character_enabledtasks WHERE charid = %i AND (", character_id); - - for (unsigned int i = 0; i < tasks_disabled.size(); i++) - queryStream - << (i ? StringFormat("taskid = %i ", tasks_disabled[i]) : StringFormat( - "OR taskid = %i ", - tasks_disabled[i] - )); - - queryStream << ")"; - - std::string query = queryStream.str(); - - if (tasks_disabled.size()) { - database.QueryDatabase(query); - } - else { - LogTasks( - "[DisableTask] DisableTask called for characterID: [{}] ... but, no tasks exist", - character_id - ); - } -} - -bool ClientTaskState::IsTaskEnabled(int task_id) -{ - std::vector::iterator Iterator; - - Iterator = enabled_tasks.begin(); - - while (Iterator != enabled_tasks.end()) { - if ((*Iterator) == task_id) { return true; } - if ((*Iterator) > task_id) { break; } - ++Iterator; - } - - return false; -} - -int ClientTaskState::EnabledTaskCount(int task_set_id) -{ - - // Return the number of tasks in TaskSet that this character is enabled for. - - unsigned int enabled_task_index = 0; - unsigned int task_set_index = 0; - int enabled_task_count = 0; - - if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } - - while ((enabled_task_index < enabled_tasks.size()) && - (task_set_index < p_task_manager->task_sets[task_set_id].size())) { - - if (enabled_tasks[enabled_task_index] == p_task_manager->task_sets[task_set_id][task_set_index]) { - enabled_task_count++; - enabled_task_index++; - task_set_index++; - continue; - } - - if (enabled_tasks[enabled_task_index] < p_task_manager->task_sets[task_set_id][task_set_index]) { - enabled_task_index++; - } - else { - task_set_index++; - } - - } - - return enabled_task_count; -} -int ClientTaskState::ActiveTasksInSet(int task_set_id) -{ - if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { - return -1; - } - - int active_task_in_set_count = 0; - for (int i : p_task_manager->task_sets[task_set_id]) { - if (IsTaskActive(i)) { - active_task_in_set_count++; - } - } - - return active_task_in_set_count; -} - -int ClientTaskState::CompletedTasksInSet(int task_set_id) -{ - if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { - return -1; - } - - int completed_tasks_count = 0; - for (int i : p_task_manager->task_sets[task_set_id]) { - if (IsTaskCompleted(i)) { - completed_tasks_count++; - } - } - - return completed_tasks_count; -} - -bool ClientTaskState::HasSlotForTask(TaskInformation *task) -{ - if (task == nullptr) { - return false; - } - - switch (task->type) { - case TaskType::Task: - return active_task.task_id == TASKSLOTEMPTY; - case TaskType::Shared: - return false; // todo - case TaskType::Quest: - for (auto &active_quest : active_quests) { - if (active_quest.task_id == TASKSLOTEMPTY) { - return true; - } - } - case TaskType::E: - return false; // removed on live - } - - return false; -} - -int TaskManager::FirstTaskInSet(int task_set) -{ - if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { - return 0; - } - - if (task_sets[task_set].empty()) { - return 0; - } - - auto iterator = task_sets[task_set].begin(); - while (iterator != task_sets[task_set].end()) { - if ((*iterator) > 0) { - return (*iterator); - } - ++iterator; - } - - return 0; -} - -int TaskManager::LastTaskInSet(int task_set) -{ - if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { - return 0; - } - - if (task_sets[task_set].empty()) { - return 0; - } - - return task_sets[task_set][task_sets[task_set].size() - 1]; -} - -int TaskManager::NextTaskInSet(int task_set, int task_id) -{ - if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { - return 0; - } - - if (task_sets[task_set].empty()) { - return 0; - } - - for (int i : task_sets[task_set]) { - if (i > task_id) { - return i; - } - } - - return 0; -} - -bool TaskManager::ValidateLevel(int task_id, int player_level) -{ - if (p_task_data[task_id] == nullptr) { - return false; - } - - if (p_task_data[task_id]->min_level && (player_level < p_task_data[task_id]->min_level)) { - return false; - } - - if (p_task_data[task_id]->max_level && (player_level > p_task_data[task_id]->max_level)) { - return false; - } - - return true; -} - -std::string TaskManager::GetTaskName(uint32 task_id) -{ - if (task_id > 0 && task_id < MAXTASKS) { - if (p_task_data[task_id] != nullptr) { - return p_task_data[task_id]->title; - } - } - - return std::string(); -} - -TaskType TaskManager::GetTaskType(uint32 task_id) -{ - if (task_id > 0 && task_id < MAXTASKS) { - if (p_task_data[task_id] != nullptr) { - return p_task_data[task_id]->type; - } - } - return TaskType::Task; -} - -void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int task_set_id) -{ - int task_list[MAXCHOOSERENTRIES]; - int task_list_index = 0; - int player_level = client->GetLevel(); - - LogTasks( - "TaskSetSelector called for task_set_id [{}] EnableTaskSize is [{}]", - task_set_id, - client_task_state->enabled_tasks.size() - ); - - if (task_set_id <= 0 || task_set_id >= MAXTASKSETS) { - return; - } - - if (task_sets[task_set_id].empty()) { - // I think this is suppose to be yellow - mob->SayString( - client, - Chat::Yellow, - MAX_ACTIVE_TASKS, - client->GetName() - ); - return; - } - - bool all_enabled = false; - - // A task_id of 0 in a TaskSet indicates that all Tasks in the set are enabled for all players. - if (task_sets[task_set_id][0] == 0) { - LogTasks("[TaskSetSelector] TaskSets[{}][0] == 0. All Tasks in Set enabled.", task_set_id); - all_enabled = true; - } - - auto iterator = task_sets[task_set_id].begin(); - if (all_enabled) { - ++iterator; - } // skip first when all enabled since it's useless data - - while (iterator != task_sets[task_set_id].end() && task_list_index < MAXCHOOSERENTRIES) { - auto task = *iterator; - // verify level, we're not currently on it, repeatable status, if it's a (shared) task - // we aren't currently on another, and if it's enabled if not all_enabled - if ((all_enabled || client_task_state->IsTaskEnabled(task)) && ValidateLevel(task, player_level) && - !client_task_state->IsTaskActive(task) && client_task_state->HasSlotForTask(p_task_data[task]) && - // this slot checking is a bit silly, but we allow mixing of task types ... - (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { - task_list[task_list_index++] = task; - } - - ++iterator; - } - - if (task_list_index > 0) { - SendTaskSelector(client, mob, task_list_index, task_list); - } - else { - // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow - mob->SayString( - client, - Chat::Yellow, - MAX_ACTIVE_TASKS, - client->GetName() - ); - } -} - -// unlike the non-Quest version of this function, it does not check enabled, that is assumed the responsibility of the quest to handle -// we do however still want it to check the other stuff like level, active, room, etc -void TaskManager::TaskQuestSetSelector( - Client *client, - ClientTaskState *client_task_state, - Mob *mob, - int count, - int *tasks -) -{ - int task_list[MAXCHOOSERENTRIES]; - int task_list_index = 0; - int player_level = client->GetLevel(); - - LogTasks("[UPDATE] TaskQuestSetSelector called for array size [{}]", count); - - if (count <= 0) { - return; - } - - for (int i = 0; i < count; ++i) { - auto task = tasks[i]; - // verify level, we're not currently on it, repeatable status, if it's a (shared) task - // we aren't currently on another, and if it's enabled if not all_enabled - if (ValidateLevel(task, player_level) && !client_task_state->IsTaskActive(task) && - client_task_state->HasSlotForTask(p_task_data[task]) && - // this slot checking is a bit silly, but we allow mixing of task types ... - (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { - task_list[task_list_index++] = task; - } - } - - if (task_list_index > 0) { - SendTaskSelector(client, mob, task_list_index, task_list); - } - else { - // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow - mob->SayString( - client, - Chat::Yellow, - MAX_ACTIVE_TASKS, - client->GetName() - ); - } -} - -// sends task selector to client -void TaskManager::SendTaskSelector(Client *client, Mob *mob, int task_count, int *task_list) -{ - if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF) { - SendTaskSelectorNew(client, mob, task_count, task_list); - return; - } - // Titanium OpCode: 0x5e7c - LogTasks("TaskSelector for [{}] Tasks", task_count); - int player_level = client->GetLevel(); - - // Check if any of the tasks exist - for (int i = 0; i < task_count; i++) { - if (p_task_data[task_list[i]] != nullptr) { - break; - } - } - - int valid_task_count = 0; - - for (int i = 0; i < task_count; i++) { - if (!ValidateLevel(task_list[i], player_level)) { - continue; - } - if (client->IsTaskActive(task_list[i])) { - continue; - } - if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { - continue; - } - - valid_task_count++; - } - - if (valid_task_count == 0) { - return; - } - - SerializeBuffer buf(50 * valid_task_count); - - buf.WriteUInt32(valid_task_count); - buf.WriteUInt32(2); // task type, live doesn't let you send more than one type, but we do? - buf.WriteUInt32(mob->GetID()); - - for (int task_index = 0; task_index < task_count; task_index++) { - if (!ValidateLevel(task_list[task_index], player_level)) { - continue; - } - if (client->IsTaskActive(task_list[task_index])) { - continue; - } - if (!IsTaskRepeatable(task_list[task_index]) && client->IsTaskCompleted(task_list[task_index])) { - continue; - } - - buf.WriteUInt32(task_list[task_index]); // task_id - - // affects color, difficulty? - if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { - buf.WriteFloat(1.0f); - } - buf.WriteUInt32(p_task_data[task_list[task_index]]->duration); - buf.WriteUInt32(static_cast(p_task_data[task_list[task_index]]->duration_code)); - - buf.WriteString(p_task_data[task_list[task_index]]->title); // max 64 with null - buf.WriteString(p_task_data[task_list[task_index]]->description); // max 4000 with null - - // Has reward set flag - if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { - buf.WriteUInt8(0); - } - - buf.WriteUInt32(p_task_data[task_list[task_index]]->activity_count); - - for (int activity_index = 0; - activity_index < p_task_data[task_list[task_index]]->activity_count; - ++activity_index) { - buf.WriteUInt32(activity_index); // ActivityNumber - auto &activity = p_task_data[task_list[task_index]]->activity_information[activity_index]; - buf.WriteUInt32(activity.activity_type); - buf.WriteUInt32(0); // solo, group, raid? - buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) - buf.WriteString(activity.item_list); // max length 64 in these clients - buf.WriteUInt32(activity.goal_count); - buf.WriteInt32(activity.skill_id); - buf.WriteInt32(activity.spell_id); - buf.WriteInt32(activity.zone_ids.empty() ? 0 : activity.zone_ids.front()); - buf.WriteString(activity.description_override); - } - } - - auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf); - - client->QueuePacket(outapp); - safe_delete(outapp); -} - -void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, int *task_list) -{ - LogTasks("SendTaskSelectorNew for [{}] Tasks", task_count); - - int player_level = client->GetLevel(); - - // Check if any of the tasks exist - for (int i = 0; i < task_count; i++) { - if (p_task_data[task_list[i]] != nullptr) { - break; - } - } - - int valid_tasks_count = 0; - for (int task_index = 0; task_index < task_count; task_index++) { - if (!ValidateLevel(task_list[task_index], player_level)) { - continue; - } - if (client->IsTaskActive(task_list[task_index])) { - continue; - } - if (!IsTaskRepeatable(task_list[task_index]) && client->IsTaskCompleted(task_list[task_index])) { - continue; - } - - valid_tasks_count++; - } - - if (valid_tasks_count == 0) { - return; - } - - SerializeBuffer buf(50 * valid_tasks_count); - - buf.WriteUInt32(valid_tasks_count); // TaskCount - buf.WriteUInt32(2); // Type, valid values: 0-3. 0 = Task, 1 = Shared Task, 2 = Quest, 3 = ??? -- should fix maybe some day, but we let more than 1 type through :P - // so I guess an NPC can only offer one type of quests or we can only open a selection with one type :P (so quest call can tell us I guess) - // this is also sent in OP_TaskDescription - buf.WriteUInt32(mob->GetID()); // TaskGiver - - for (int i = 0; i < task_count; i++) { // max 40 - if (!ValidateLevel(task_list[i], player_level)) { - continue; - } - if (client->IsTaskActive(task_list[i])) { - continue; - } - if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { - continue; - } - - buf.WriteUInt32(task_list[i]); // task_id - buf.WriteFloat(1.0f); // affects color, difficulty? - buf.WriteUInt32(p_task_data[task_list[i]]->duration); - buf.WriteUInt32(static_cast(p_task_data[task_list[i]]->duration_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited - - buf.WriteString(p_task_data[task_list[i]]->title); // max 64 with null - buf.WriteString(p_task_data[task_list[i]]->description); // max 4000 with null - - buf.WriteUInt8(0); // Has reward set flag - buf.WriteUInt32(p_task_data[task_list[i]]->activity_count); // activity_count - - for (int j = 0; j < p_task_data[task_list[i]]->activity_count; ++j) { - buf.WriteUInt32(j); // ActivityNumber - auto &activity = p_task_data[task_list[i]]->activity_information[j]; - buf.WriteUInt32(activity.activity_type); // ActivityType - buf.WriteUInt32(0); // solo, group, raid? - buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) - - // this string is item names - buf.WriteLengthString(activity.item_list); - - buf.WriteUInt32(activity.goal_count); // GoalCount - - // this string is skill IDs? probably one of the "use on" tasks - buf.WriteLengthString(activity.skill_list); - - // this string is spell IDs? probably one of the "use on" tasks - buf.WriteLengthString(activity.spell_list); - - //buf.WriteString(itoa(Tasks[TaskList[i]]->activity_information[activity_id].ZoneID)); - buf.WriteString(activity.zones); // Zone number in ascii max length 64, can be multiple with separated by ; - buf.WriteString(activity.description_override); // max length 128 -- overrides the automatic descriptions - // this doesn't appear to be shown to the client at all and isn't the same as zones ... defaults to '0' though - buf.WriteString(activity.zones); // Zone number in ascii max length 64, probably can be separated by ; too, haven't found it used - } - } - - auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf); - - client->QueuePacket(outapp); - safe_delete(outapp); -} - -int TaskManager::GetActivityCount(int task_id) -{ - if ((task_id > 0) && (task_id < MAXTASKS)) { - if (p_task_data[task_id]) { return p_task_data[task_id]->activity_count; } - } - - return 0; -} - -void TaskManager::ExplainTask(Client *client, int task_id) -{ - - // TODO: This method is not finished (hardly started). It was intended to - // explain in English, what each activity_information did, conditions for step unlocking, etc. - // - return; - - if (!client) { return; } - - if ((task_id <= 0) || (task_id >= MAXTASKS)) { - client->Message(Chat::White, "task_id out-of-range."); - return; - } - - if (p_task_data[task_id] == nullptr) { - client->Message(Chat::White, "Task does not exist."); - return; - } - - char explanation[1000], *ptr; - client->Message(Chat::White, "Task %4i: title: %s", task_id, p_task_data[task_id]->description.c_str()); - client->Message(Chat::White, "%3i Activities", p_task_data[task_id]->activity_count); - ptr = explanation; - for (int i = 0; i < p_task_data[task_id]->activity_count; i++) { - - sprintf(ptr, "Act: %3i: ", i); - ptr = ptr + strlen(ptr); - switch (p_task_data[task_id]->activity_information[i].activity_type) { - case ActivityDeliver: - sprintf(ptr, "Deliver"); - break; - } - - } -} - -ClientTaskState::ClientTaskState() -{ - active_task_count = 0; - last_completed_task_loaded = 0; - checked_touch_activities = false; - - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - active_quests[i].slot = i; - active_quests[i].task_id = TASKSLOTEMPTY; - } - - active_task.slot = 0; - active_task.task_id = TASKSLOTEMPTY; - // TODO: shared task -} - -ClientTaskState::~ClientTaskState() -{ -} - - -int ClientTaskState::GetActiveTaskID(int index) -{ - // Return the task_id from the client's specified Active Task slot. - if ((index < 0) || (index >= MAXACTIVEQUESTS)) { - return 0; - } - - return active_quests[index].task_id; -} - -static void DeleteCompletedTaskFromDatabase(int character_id, int task_id) -{ - LogTasks("[DeleteCompletedTasksFromDatabase] character_id [{}], task_id [{}]", character_id, task_id); - - CompletedTasksRepository::DeleteWhere( - database, - fmt::format("charid = {} and taskid = {}", character_id, task_id) - ); -} - -bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation &task_info) -{ - bool all_activities_complete = true; - - TaskInformation *p_task_information = p_task_manager->p_task_data[task_info.task_id]; - if (p_task_information == nullptr) { - return true; - } - - // On loading the client state, all activities that are not completed, are - // marked as hidden. For Sequential (non-stepped) mode, we mark the first - // activity_information as active if not complete. - LogTasks( - "character_id [{}] task_id [{}] sequence_mode [{}]", - character_id, - task_info.task_id, - p_task_information->sequence_mode - ); - - if (p_task_information->sequence_mode == ActivitiesSequential) { - if (task_info.activity[0].activity_state != ActivityCompleted) { - task_info.activity[0].activity_state = ActivityActive; - } - - // Enable the next Hidden task. - for (int i = 0; i < p_task_information->activity_count; i++) { - if ((task_info.activity[i].activity_state == ActivityActive) && - (!p_task_information->activity_information[i].optional)) { - all_activities_complete = false; - break; - } - - if (task_info.activity[i].activity_state == ActivityHidden) { - task_info.activity[i].activity_state = ActivityActive; - all_activities_complete = false; - break; - } - } - - if (all_activities_complete && RuleB(TaskSystem, RecordCompletedTasks)) { - if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { - LogTasks("KeepOneRecord enabled"); - auto iterator = completed_tasks.begin(); - int erased_elements = 0; - while (iterator != completed_tasks.end()) { - int task_id = (*iterator).task_id; - if (task_id == task_info.task_id) { - iterator = completed_tasks.erase(iterator); - erased_elements++; - } - else { - ++iterator; - } - } - - LogTasks("Erased Element count is [{}]", erased_elements); - - if (erased_elements) { - last_completed_task_loaded -= erased_elements; - DeleteCompletedTaskFromDatabase(character_id, task_info.task_id); - } - } - - CompletedTaskInformation completed_task_information{}; - completed_task_information.task_id = task_info.task_id; - completed_task_information.completed_time = time(nullptr); - - for (int i = 0; i < p_task_information->activity_count; i++) { - completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == - ActivityCompleted); - } - - completed_tasks.push_back(completed_task_information); - } - - LogTasks("Returning sequential task, AllActivitiesComplete is [{}]", all_activities_complete); - - return all_activities_complete; - } - - // Stepped Mode - // TODO: This code is probably more complex than it needs to be - - bool current_step_complete = true; - - LogTasks( - "[UnlockActivities] Current step [{}] last_step [{}]", - task_info.current_step, - p_task_information->last_step - ); - - // If current_step is -1, this is the first call to this method since loading the - // client state. Unlock all activities with a step number of 0 - - if (task_info.current_step == -1) { - for (int i = 0; i < p_task_information->activity_count; i++) { - - if (p_task_information->activity_information[i].step_number == 0 && - task_info.activity[i].activity_state == ActivityHidden) { - task_info.activity[i].activity_state = ActivityActive; - // task_info.activity_information[i].updated=true; - } - } - task_info.current_step = 0; - } - - for (int current_step = task_info.current_step; current_step <= p_task_information->last_step; current_step++) { - for (int activity = 0; activity < p_task_information->activity_count; activity++) { - if (p_task_information->activity_information[activity].step_number == (int) task_info.current_step) { - if ((task_info.activity[activity].activity_state != ActivityCompleted) && - (!p_task_information->activity_information[activity].optional)) { - current_step_complete = false; - all_activities_complete = false; - break; - } - } - } - if (!current_step_complete) { - break; - } - task_info.current_step++; - } - - if (all_activities_complete) { - if (RuleB(TaskSystem, RecordCompletedTasks)) { - // If we are only keeping one completed record per task, and the player has done - // the same task again, erase the previous completed entry for this task. - if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { - LogTasksDetail("[UnlockActivities] KeepOneRecord enabled"); - auto iterator = completed_tasks.begin(); - int erased_elements = 0; - - while (iterator != completed_tasks.end()) { - int task_id = (*iterator).task_id; - if (task_id == task_info.task_id) { - iterator = completed_tasks.erase(iterator); - erased_elements++; - } - else { - ++iterator; - } - } - - LogTasksDetail("[UnlockActivities] Erased Element count is [{}]", erased_elements); - - if (erased_elements) { - last_completed_task_loaded -= erased_elements; - DeleteCompletedTaskFromDatabase(character_id, task_info.task_id); - } - } - - CompletedTaskInformation completed_task_information{}; - completed_task_information.task_id = task_info.task_id; - completed_task_information.completed_time = time(nullptr); - - for (int i = 0; i < p_task_information->activity_count; i++) { - completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == - ActivityCompleted); - } - - completed_tasks.push_back(completed_task_information); - } - return true; - } - - // Mark all non-completed tasks in the current step as active - for (int activity = 0; activity < p_task_information->activity_count; activity++) { - if ((p_task_information->activity_information[activity].step_number == (int) task_info.current_step) && - (task_info.activity[activity].activity_state == ActivityHidden)) { - task_info.activity[activity].activity_state = ActivityActive; - task_info.activity[activity].updated = true; - } - } - - return false; -} - -void ClientTaskState::UpdateTasksOnKill(Client *client, int npc_type_id) -{ - UpdateTasksByNPC(client, ActivityKill, npc_type_id); -} - -bool ClientTaskState::UpdateTasksOnSpeakWith(Client *client, int npc_type_id) -{ - return UpdateTasksByNPC(client, ActivitySpeakWith, npc_type_id); -} - -bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int npc_type_id) -{ - - int is_updating = false; - - // If the client has no tasks, there is nothing further to check. - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... - return false; - } - - // loop over the union of tasks and quests - for (auto &ActiveTask : active_tasks) { - auto current_task = &ActiveTask; - if (current_task->task_id == TASKSLOTEMPTY) { - continue; - } - - // Check if there are any active kill activities for this p_task_information - auto p_task_data = p_task_manager->p_task_data[current_task->task_id]; - if (p_task_data == nullptr) { - return false; - } - - for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { - ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; - ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; - - // We are not interested in completed or hidden activities - if (client_activity->activity_state != ActivityActive) { - continue; - } - // We are only interested in Kill activities - if (activity_info->activity_type != activity_type) { - continue; - } - // Is there a zone restriction on the activity_information ? - if (!activity_info->CheckZone(zone->GetZoneID())) { - LogTasks( - "[UPDATE] character [{}] task_id [{}] activity_id [{}] activity_type [{}] for NPC [{}] failed zone check", - client->GetName(), - current_task->task_id, - activity_id, - activity_type, - npc_type_id - ); - continue; - } - // Is the activity_information to kill this type of NPC ? - switch (activity_info->goal_method) { - case METHODSINGLEID: - if (activity_info->goal_id != npc_type_id) { - continue; - } - break; - - case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList( - activity_info->goal_id, - npc_type_id - )) { - continue; - } - break; - - default: - // If METHODQUEST, don't updated the activity_information here - continue; - } - // We found an active p_task_information to kill this type of NPC, so increment the done count - LogTasksDetail("Calling increment done count ByNPC"); - IncrementDoneCount(client, p_task_data, current_task->slot, activity_id); - is_updating = true; - } - } - - return is_updating; -} - -int ClientTaskState::ActiveSpeakTask(int npc_type_id) -{ - - // This method is to be used from Perl quests only and returns the task_id of the first - // active task found which has an active SpeakWith activity_information for this NPC. - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... - return 0; - } - - // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { - auto current_task = &active_task; - if (current_task->task_id == TASKSLOTEMPTY) { - continue; - } - - TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; - if (p_task_data == nullptr) { - continue; - } - - for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { - ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; - ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; - - // We are not interested in completed or hidden activities - if (client_activity->activity_state != ActivityActive) { - continue; - } - if (activity_info->activity_type != ActivitySpeakWith) { - continue; - } - // Is there a zone restriction on the activity_information ? - if (!activity_info->CheckZone(zone->GetZoneID())) { - continue; - } - // Is the activity_information to speak with this type of NPC ? - if (activity_info->goal_method == METHODQUEST && activity_info->goal_id == npc_type_id) { - return current_task->task_id; - } - } - } - - return 0; -} - -int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) -{ - - // This method is to be used from Perl quests only and returns the activity_id of the first - // active activity_information found in the specified task which is to SpeakWith this NPC. - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... - return -1; - } - if (task_id <= 0 || task_id >= MAXTASKS) { - return -1; - } - - // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { - auto current_task = &active_task; - if (current_task->task_id != task_id) { - continue; - } - - TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; - if (p_task_data == nullptr) { - continue; - } - - for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { - ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; - ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; - - // We are not interested in completed or hidden activities - if (client_activity->activity_state != ActivityActive) { - continue; - } - if (activity_info->activity_type != ActivitySpeakWith) { - continue; - } - // Is there a zone restriction on the activity_information ? - if (!activity_info->CheckZone(zone->GetZoneID())) { - continue; - } - - // Is the activity_information to speak with this type of NPC ? - if (activity_info->goal_method == METHODQUEST && activity_info->goal_id == npc_type_id) { - return activity_id; - } - } - return 0; - } - return 0; -} - -void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_type, int item_id, int count) -{ - - // This method updates the client's task activities of the specified type which relate - // to the specified item. - // - // Type should be one of ActivityLoot, ActivityTradeSkill, ActivityFish or ActivityForage - - // If the client has no tasks, there is nothing further to check. - - LogTasks( - "[UpdateTasksForItem] activity_type [{}] item_id [{}]", - activity_type, - item_id - ); - - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... - return; - } - - // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { - auto current_task = &active_task; - if (current_task->task_id == TASKSLOTEMPTY) { - continue; - } - - // Check if there are any active loot activities for this task - - TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; - if (p_task_data == nullptr) { - return; - } - - for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { - ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; - ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; - - // We are not interested in completed or hidden activities - if (client_activity->activity_state != ActivityActive) { - continue; - } - // We are only interested in the ActivityType we were called with - if (activity_info->activity_type != (int) activity_type) { - continue; - } - // Is there a zone restriction on the activity_information ? - if (!activity_info->CheckZone(zone->GetZoneID())) { - LogTasks( - "[UpdateTasksForItem] Error: Character [{}] activity_information type [{}] for Item [{}] failed zone check", - client->GetName(), - activity_type, - item_id - ); - continue; - } - // Is the activity_information related to this item ? - // - switch (activity_info->goal_method) { - - case METHODSINGLEID: - if (activity_info->goal_id != item_id) { continue; } - break; - - case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList( - activity_info->goal_id, - item_id - )) { continue; } - break; - - default: - // If METHODQUEST, don't updated the activity_information here - continue; - } - // We found an active task related to this item, so increment the done count - LogTasksDetail("[UpdateTasksForItem] Calling increment done count ForItem"); - IncrementDoneCount(client, p_task_data, current_task->slot, activity_id, count); - } - } -} - -void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) -{ - LogTasks("[UpdateTasksOnExplore] explore_id [{}]", explore_id); - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... - return; - } - - // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { - auto current_task = &active_task; - if (current_task->task_id == TASKSLOTEMPTY) { - continue; - } - - // Check if there are any active explore activities for this task - - TaskInformation *task_data = p_task_manager->p_task_data[current_task->task_id]; - if (task_data == nullptr) { - return; - } - - for (int activity_id = 0; activity_id < task_data->activity_count; activity_id++) { - ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; - ActivityInformation *activity_info = &task_data->activity_information[activity_id]; - - // We are not interested in completed or hidden activities - if (client_activity->activity_state != ActivityActive) { - continue; - } - // We are only interested in explore activities - if (activity_info->activity_type != ActivityExplore) { - continue; - } - if (!activity_info->CheckZone(zone->GetZoneID())) { - LogTasks( - "[UpdateTasksOnExplore] character [{}] explore_id [{}] failed zone check", - client->GetName(), - explore_id - ); - continue; - } - // Is the activity_information to explore this area id ? - switch (activity_info->goal_method) { - - case METHODSINGLEID: - if (activity_info->goal_id != explore_id) { - continue; - } - break; - - case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList( - activity_info->goal_id, - explore_id - )) { - continue; - } - break; - - default: - // If METHODQUEST, don't updated the activity_information here - continue; - } - - // We found an active task to explore this area, so set done count to goal count - // (Only a goal count of 1 makes sense for explore activities?) - LogTasks( - "[UpdateTasksOnExplore] character [{}] explore_id [{}] increment on explore", - client->GetName(), - explore_id - ); - - IncrementDoneCount( - client, - task_data, - current_task->slot, - activity_id, - activity_info->goal_count - current_task->activity[activity_id].done_count - ); - } - } -} - -bool -ClientTaskState::UpdateTasksOnDeliver(Client *client, std::list &items, int cash, int npc_type_id) -{ - bool is_updated = false; - - LogTasks("[UpdateTasksOnDeliver] [{}]", npc_type_id); - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... - return false; - } - - // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto current_task = &active_tasks[i]; - if (current_task->task_id == TASKSLOTEMPTY) { - continue; - } - - // Check if there are any active deliver activities for this task - TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; - if (p_task_data == nullptr) { - return false; - } - - for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { - ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; - ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; - - // We are not interested in completed or hidden activities - if (client_activity->activity_state != ActivityActive) { - continue; - } - - // We are only interested in Deliver activities - if (activity_info->activity_type != ActivityDeliver && - activity_info->activity_type != ActivityGiveCash) { - continue; - } - // Is there a zone restriction on the activity_information ? - if (!activity_info->CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] Char: %s Deliver activity_information failed zone check (current zone %i, need zone " - "%s", - client->GetName(), zone->GetZoneID(), activity_info->zones.c_str()); - continue; - } - // Is the activity_information to deliver to this NPCTypeID ? - if (activity_info->deliver_to_npc != npc_type_id) { - continue; - } - // Is the activity_information related to these items ? - // - if ((activity_info->activity_type == ActivityGiveCash) && cash) { - LogTasks("[UpdateTasksOnDeliver] Increment on GiveCash"); - IncrementDoneCount(client, p_task_data, i, activity_id, cash); - is_updated = true; - } - else { - for (auto &item : items) { - switch (activity_info->goal_method) { - case METHODSINGLEID: - if (activity_info->goal_id != item->GetID()) { - continue; - } - break; - - case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList( - activity_info->goal_id, - item->GetID())) { - continue; - } - break; - - default: - // If METHODQUEST, don't updated the activity_information here - continue; - } - // We found an active task related to this item, so increment the done count - LogTasks("[UpdateTasksOnDeliver] Increment on GiveItem"); - IncrementDoneCount( - client, - p_task_data, - current_task->slot, - activity_id, - item->GetCharges() <= 0 ? 1 : item->GetCharges() - ); - is_updated = true; - } - } - } - } - - return is_updated; -} - -void ClientTaskState::UpdateTasksOnTouch(Client *client, int zone_id) -{ - // If the client has no tasks, there is nothing further to check. - - LogTasks("[UpdateTasksOnTouch] [{}] ", zone_id); - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... - return; - } - - // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { - auto current_task = &active_task; - if (current_task->task_id == TASKSLOTEMPTY) { - continue; - } - - // Check if there are any active explore activities for this task - TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; - if (p_task_data == nullptr) { - return; - } - - for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { - ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; - ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; - - // We are not interested in completed or hidden activities - if (current_task->activity[activity_id].activity_state != ActivityActive) { - continue; - } - // We are only interested in touch activities - if (activity_info->activity_type != ActivityTouch) { - continue; - } - if (activity_info->goal_method != METHODSINGLEID) { - continue; - } - if (!activity_info->CheckZone(zone_id)) { - LogTasks( - "[UpdateTasksOnTouch] character [{}] Touch activity_information failed zone check", - client->GetName() - ); - continue; - } - - // We found an active task to zone into this zone, so set done count to goal count - // (Only a goal count of 1 makes sense for touch activities?) - LogTasks("[UpdateTasksOnTouch] Increment on Touch"); - IncrementDoneCount( - client, - p_task_data, - current_task->slot, - activity_id, - activity_info->goal_count - current_task->activity[activity_id].done_count - ); - } - } -} - -void ClientTaskState::IncrementDoneCount( - Client *client, - TaskInformation *task_information, - int task_index, - int activity_id, - int count, - bool ignore_quest_update -) -{ - Log(Logs::General, Logs::Tasks, "[UPDATE] IncrementDoneCount"); - - auto info = GetClientTaskInfo(task_information->type, task_index); - - if (info == nullptr) { - return; - } - - info->activity[activity_id].done_count += count; - - if (info->activity[activity_id].done_count > task_information->activity_information[activity_id].goal_count) { - info->activity[activity_id].done_count = task_information->activity_information[activity_id].goal_count; - } - - if (!ignore_quest_update) { - char buf[24]; - snprintf( - buf, - 23, - "%d %d %d", - info->activity[activity_id].done_count, - info->activity[activity_id].activity_id, - info->task_id - ); - buf[23] = '\0'; - parse->EventPlayer(EVENT_TASK_UPDATE, client, buf, 0); - } - - info->activity[activity_id].updated = true; - // Have we reached the goal count for this activity_information ? - if (info->activity[activity_id].done_count >= task_information->activity_information[activity_id].goal_count) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Done (%i) = Goal (%i) for activity_information %i", - info->activity[activity_id].done_count, - task_information->activity_information[activity_id].goal_count, - activity_id); - - // Flag the activity_information as complete - info->activity[activity_id].activity_state = ActivityCompleted; - // Unlock subsequent activities for this task - bool TaskComplete = UnlockActivities(client->CharacterID(), *info); - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskCompleted is %i", TaskComplete); - // and by the 'Task Stage Completed' message - client->SendTaskActivityComplete(info->task_id, activity_id, task_index, task_information->type); - // Send the updated task/activity_information list to the client - p_task_manager->SendSingleActiveTaskToClient(client, *info, TaskComplete, false); - // Inform the client the task has been updated, both by a chat message - client->Message(Chat::White, "Your task '%s' has been updated.", task_information->title.c_str()); - - if (task_information->activity_information[activity_id].goal_method != METHODQUEST) { - if (!ignore_quest_update) { - char buf[24]; - snprintf(buf, 23, "%d %d", info->task_id, info->activity[activity_id].activity_id); - buf[23] = '\0'; - parse->EventPlayer(EVENT_TASK_STAGE_COMPLETE, client, buf, 0); - } - /* QS: PlayerLogTaskUpdates :: Update */ - if (RuleB(QueryServ, PlayerLogTaskUpdates)) { - std::string event_desc = StringFormat( - "Task Stage Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", - info->task_id, - info->activity[activity_id].activity_id, - info->activity[activity_id].done_count, - client->GetZoneID(), - client->GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_Task_Updates, client->CharacterID(), event_desc); - } - } - - // If this task is now complete, the Completed tasks will have been - // updated in UnlockActivities. Send the completed task list to the - // client. This is the same sequence the packets are sent on live. - if (TaskComplete) { - char buf[24]; - snprintf( - buf, - 23, - "%d %d %d", - info->activity[activity_id].done_count, - info->activity[activity_id].activity_id, - info->task_id - ); - buf[23] = '\0'; - parse->EventPlayer(EVENT_TASK_COMPLETE, client, buf, 0); - - /* QS: PlayerLogTaskUpdates :: Complete */ - if (RuleB(QueryServ, PlayerLogTaskUpdates)) { - std::string event_desc = StringFormat( - "Task Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", - info->task_id, - info->activity[activity_id].activity_id, - info->activity[activity_id].done_count, - client->GetZoneID(), - client->GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_Task_Updates, client->CharacterID(), event_desc); - } - - p_task_manager->SendCompletedTasksToClient(client, this); - client->SendTaskActivityComplete(info->task_id, 0, task_index, task_information->type, 0); - p_task_manager->SaveClientState(client, this); - //c->SendTaskComplete(TaskIndex); - client->CancelTask(task_index, task_information->type); - //if(Task->reward_method != METHODQUEST) RewardTask(c, Task); - // If Experience and/or cash rewards are set, reward them from the task even if reward_method is METHODQUEST - RewardTask(client, task_information); - //RemoveTask(c, TaskIndex); - - } - - } - else { - // Send an updated packet for this single activity_information - p_task_manager->SendTaskActivityLong( - client, info->task_id, activity_id, task_index, - task_information->activity_information[activity_id].optional - ); - p_task_manager->SaveClientState(client, this); - } -} - -void ClientTaskState::RewardTask(Client *client, TaskInformation *task_information) -{ - - if (!task_information || !client) { - return; - } - - const EQ::ItemData *Item; - std::vector RewardList; - - switch (task_information->reward_method) { - case METHODSINGLEID: { - if (task_information->reward_id) { - client->SummonItem(task_information->reward_id); - Item = database.GetItem(task_information->reward_id); - if (Item) { - client->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); - } - } - break; - } - case METHODLIST: { - RewardList = p_task_manager->goal_list_manager.GetListContents(task_information->reward_id); - for (int i : RewardList) { - client->SummonItem(i); - Item = database.GetItem(i); - if (Item) { - client->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); - } - } - break; - } - default: { - // Nothing special done for METHODQUEST - break; - } - } - - if (!task_information->completion_emote.empty()) { - client->SendColoredText( - Chat::Yellow, - task_information->completion_emote - ); - } // unsure if they use this packet or color, should work - - // just use normal NPC faction ID stuff - if (task_information->faction_reward) { - client->SetFactionLevel( - client->CharacterID(), - task_information->faction_reward, - client->GetBaseClass(), - client->GetBaseRace(), - client->GetDeity() - ); - } - - if (task_information->cash_reward) { - int platinum, gold, silver, copper; - - copper = task_information->cash_reward; - client->AddMoneyToPP(copper, true); - - platinum = copper / 1000; - copper = copper - (platinum * 1000); - gold = copper / 100; - copper = copper - (gold * 100); - silver = copper / 10; - copper = copper - (silver * 10); - - std::string cash_message; - - if (platinum > 0) { - cash_message = "You receive "; - cash_message += itoa(platinum); - cash_message += " platinum"; - } - if (gold > 0) { - if (cash_message.length() == 0) { - cash_message = "You receive "; - } - else { - cash_message += ","; - } - cash_message += itoa(gold); - cash_message += " gold"; - } - if (silver > 0) { - if (cash_message.length() == 0) { - cash_message = "You receive "; - } - else { - cash_message += ","; - } - cash_message += itoa(silver); - cash_message += " silver"; - } - if (copper > 0) { - if (cash_message.length() == 0) { - cash_message = "You receive "; - } - else { - cash_message += ","; - } - cash_message += itoa(copper); - cash_message += " copper"; - } - cash_message += " pieces."; - client->Message(Chat::Yellow, cash_message.c_str()); - } - int32 experience_reward = task_information->experience_reward; - if (experience_reward > 0) { - client->AddEXP(experience_reward); - } - if (experience_reward < 0) { - uint32 pos_reward = experience_reward * -1; - // Minimal Level Based Exp reward Setting is 101 (1% exp at level 1) - if (pos_reward > 100 && pos_reward < 25700) { - uint8 max_level = pos_reward / 100; - uint8 exp_percent = pos_reward - (max_level * 100); - client->AddLevelBasedExp(exp_percent, max_level); - } - } - - client->SendSound(); -} - -bool ClientTaskState::IsTaskActive(int task_id) -{ - if (active_task.task_id == task_id) { - return true; - } - - if (active_task_count == 0 || task_id == 0) { - return false; - } - - for (auto &active_quest : active_quests) { - if (active_quest.task_id == task_id) { - return true; - } - } - - return false; -} - -void ClientTaskState::FailTask(Client *client, int task_id) -{ - LogTasks( - "[FailTask] Failing task for character [{}] task_id [{}] task_count [{}]", - client->GetCleanName(), - task_id, - active_task_count - ); - - if (active_task.task_id == task_id) { - client->SendTaskFailed(task_id, 0, TaskType::Task); - // Remove the task from the client - client->CancelTask(0, TaskType::Task); - return; - } - - // TODO: shared tasks - - if (active_task_count == 0) { - return; - } - - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { - client->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); - // Remove the task from the client - client->CancelTask(i, TaskType::Quest); - return; - } - } -} - -// TODO: Shared tasks -bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) -{ - LogTasks("[IsTaskActivityActive] task_id [{}] activity_id [{}]", task_id, activity_id); - - // Quick sanity check - if (activity_id < 0) { - return false; - } - if (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY) { - return false; - } - - int active_task_index = -1; - auto task_type = TaskType::Task; - - if (active_task.task_id == task_id) { - active_task_index = 0; - } - - if (active_task_index == -1) { - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { - active_task_index = i; - task_type = TaskType::Quest; - break; - } - } - } - - // The client does not have this task - if (active_task_index == -1) { - return false; - } - - auto info = GetClientTaskInfo(task_type, active_task_index); - - if (info == nullptr) { - return false; - } - - TaskInformation *p_task_data = p_task_manager->p_task_data[info->task_id]; - - // The task is invalid - if (p_task_data == nullptr) { - return false; - } - - // The activity_id is out of range - if (activity_id >= p_task_data->activity_count) { - return false; - } - - LogTasks( - "[IsTaskActivityActive] (Update) task_id [{}] activity_id [{}] activity_state", - task_id, - activity_id, - info->activity[activity_id].activity_state - ); - - return (info->activity[activity_id].activity_state == ActivityActive); -} - -void ClientTaskState::UpdateTaskActivity( - Client *client, - int task_id, - int activity_id, - int count, - bool ignore_quest_update /*= false*/) -{ - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState UpdateTaskActivity(%i, %i, %i).", task_id, activity_id, - count); - - // Quick sanity check - if (activity_id < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { - return; - } - - int active_task_index = -1; - auto type = TaskType::Task; - - if (active_task.task_id == task_id) { - active_task_index = 0; - } - - if (active_task_index == -1) { - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { - active_task_index = i; - type = TaskType::Quest; - break; - } - } - } - - // The client does not have this task - if (active_task_index == -1) { - return; - } - - auto info = GetClientTaskInfo(type, active_task_index); - - if (info == nullptr) { - return; - } - - TaskInformation *Task = p_task_manager->p_task_data[info->task_id]; - - // The task is invalid - if (Task == nullptr) { - return; - } - - // The activity_id is out of range - if (activity_id >= Task->activity_count) { - return; - } - - // The activity_information is not currently active - if (info->activity[activity_id].activity_state == ActivityHidden) { - return; - } - - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment done count on UpdateTaskActivity %d %d", activity_id, count); - IncrementDoneCount(client, Task, active_task_index, activity_id, count, ignore_quest_update); -} - -void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activity_id) -{ - Log(Logs::General, Logs::Tasks, "[RESET] ClientTaskState ResetTaskActivity(%i, %i).", task_id, activity_id); - - // Quick sanity check - if (activity_id < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { - return; - } - - int active_task_index = -1; - auto type = TaskType::Task; - - if (active_task.task_id == task_id) { - active_task_index = 0; - } - - if (active_task_index == -1) { - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { - active_task_index = i; - type = TaskType::Quest; - break; - } - } - } - - // The client does not have this task - if (active_task_index == -1) { - return; - } - - auto info = GetClientTaskInfo(type, active_task_index); - - if (info == nullptr) { - return; - } - - TaskInformation *p_task_data = p_task_manager->p_task_data[info->task_id]; - if (p_task_data == nullptr) { - return; - } - - // The activity_id is out of range - if (activity_id >= p_task_data->activity_count) { - return; - } - - // The activity_information is not currently active - if (info->activity[activity_id].activity_state == ActivityHidden) { - return; - } - - Log(Logs::General, Logs::Tasks, "[RESET] Increment done count on ResetTaskActivity"); - IncrementDoneCount( - client, - p_task_data, - active_task_index, - activity_id, - (info->activity[activity_id].done_count * -1), - false - ); -} - -void ClientTaskState::ShowClientTasks(Client *client) -{ - client->Message(Chat::White, "Task Information:"); - if (active_task.task_id != TASKSLOTEMPTY) { - client->Message( - Chat::White, - "Task: %i %s", - active_task.task_id, - p_task_manager->p_task_data[active_task.task_id]->title.c_str() - ); - client->Message( - Chat::White, - " description: [%s]\n", - p_task_manager->p_task_data[active_task.task_id]->description.c_str() - ); - for (int activity_id = 0; activity_id < p_task_manager->GetActivityCount(active_task.task_id); activity_id++) { - client->Message( - Chat::White, - " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - active_task.activity[activity_id].activity_id, - active_task.activity[activity_id].done_count, - active_task.activity[activity_id].activity_state - ); - } - } - - for (auto &active_quest : active_quests) { - if (active_quest.task_id == TASKSLOTEMPTY) { - continue; - } - - client->Message( - Chat::White, "Quest: %i %s", active_quest.task_id, - p_task_manager->p_task_data[active_quest.task_id]->title.c_str() - ); - - client->Message( - Chat::White, - " description: [%s]\n", - p_task_manager->p_task_data[active_quest.task_id]->description.c_str() - ); - - for (int j = 0; j < p_task_manager->GetActivityCount(active_quest.task_id); j++) { - client->Message( - Chat::White, - " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - active_quest.activity[j].activity_id, - active_quest.activity[j].done_count, - active_quest.activity[j].activity_state - ); - } - } -} - -// TODO: Shared Task -int ClientTaskState::TaskTimeLeft(int task_id) -{ - if (active_task.task_id == task_id) { - int time_now = time(nullptr); - - TaskInformation *p_task_data = p_task_manager->p_task_data[task_id]; - if (p_task_data == nullptr) { - return -1; - } - - if (!p_task_data->duration) { - return -1; - } - - int time_left = (active_task.accepted_time + p_task_data->duration - time_now); - - return (time_left > 0 ? time_left : 0); - } - - if (active_task_count == 0) { - return -1; - } - - for (auto &active_quest : active_quests) { - if (active_quest.task_id != task_id) { - continue; - } - - int time_now = time(nullptr); - - TaskInformation *p_task_data = p_task_manager->p_task_data[active_quest.task_id]; - if (p_task_data == nullptr) { - return -1; - } - - if (!p_task_data->duration) { - return -1; - } - - int time_left = (active_quest.accepted_time + p_task_data->duration - time_now); - - // If Timeleft is negative, return 0, else return the number of seconds left - - return (time_left > 0 ? time_left : 0); - } - - return -1; -} - -int ClientTaskState::IsTaskCompleted(int task_id) -{ - - // Returns: -1 if RecordCompletedTasks is not true - // +1 if the task has been completed - // 0 if the task has not been completed - - if (!(RuleB(TaskSystem, RecordCompletedTasks))) { - return -1; - } - - for (auto &completed_task : completed_tasks) { - LogTasks("[IsTaskCompleted] Comparing compelted task [{}] with [{}]", completed_task.task_id, task_id); - if (completed_task.task_id == task_id) { - return 1; - } - } - - return 0; -} - -bool TaskManager::IsTaskRepeatable(int task_id) -{ - if ((task_id <= 0) || (task_id >= MAXTASKS)) { - return false; - } - - TaskInformation *task_data = p_task_manager->p_task_data[task_id]; - if (task_data == nullptr) { - return false; - } - - return task_data->repeatable; -} - -bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) -{ - // Returns true if the Task in the specified slot has a time limit that has been exceeded. - auto info = GetClientTaskInfo(task_type, index); - if (info == nullptr) { - return false; - } - - // make sure the task_id is at least maybe in our array - if (info->task_id <= 0 || info->task_id >= MAXTASKS) { - return false; - } - - int time_now = time(nullptr); - - TaskInformation *task_data = p_task_manager->p_task_data[info->task_id]; - if (task_data == nullptr) { - return false; - } - - return (task_data->duration && (info->accepted_time + task_data->duration <= time_now)); -} - -void ClientTaskState::TaskPeriodicChecks(Client *client) -{ - if (active_task.task_id != TASKSLOTEMPTY) { - if (TaskOutOfTime(TaskType::Task, 0)) { - // Send Red Task Failed Message - client->SendTaskFailed(active_task.task_id, 0, TaskType::Task); - // Remove the task from the client - client->CancelTask(0, TaskType::Task); - // It is a conscious decision to only fail one task per call to this method, - // otherwise the player will not see all the failed messages where multiple - // tasks fail at the same time. - return; - } - } - - // TODO: shared tasks -- although that will probably be manager in world checking and telling zones to fail us - - if (active_task_count == 0) { - return; - } - - // Check for tasks that have failed because they have not been completed in the specified time - // - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == TASKSLOTEMPTY) { - continue; - } - - if (TaskOutOfTime(TaskType::Quest, i)) { - // Send Red Task Failed Message - client->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); - // Remove the task from the client - client->CancelTask(i, TaskType::Quest); - // It is a conscious decision to only fail one task per call to this method, - // otherwise the player will not see all the failed messages where multiple - // tasks fail at the same time. - break; - } - } - - // Check for activities that require zoning into a specific zone. - // This is done in this method because it gives an extra few seconds for the client screen to display - // the zone before we send the 'Task activity_information Completed' message. - // - if (!checked_touch_activities) { - UpdateTasksOnTouch(client, zone->GetZoneID()); - checked_touch_activities = true; - } -} - #if 0 void Client::SendTaskComplete(int TaskIndex) { @@ -2899,88 +66,6 @@ void Client::SendTaskComplete(int TaskIndex) { } #endif -void ClientTaskState::SendTaskHistory(Client *client, int task_index) -{ - - LogTasks("[SendTaskHistory] Task history requested for completed task index [{}]", task_index); - - // We only sent the most recent 50 completed tasks, so we need to offset the Index the client sent to us. - - int adjusted_task_index = task_index; - if (completed_tasks.size() > 50) { - adjusted_task_index += (completed_tasks.size() - 50); - } - - if ((adjusted_task_index < 0) || (adjusted_task_index >= (int) completed_tasks.size())) { - return; - } - - int TaskID = completed_tasks[adjusted_task_index].task_id; - - if ((TaskID < 0) || (TaskID > MAXTASKS)) { - return; - } - - TaskInformation *Task = p_task_manager->p_task_data[TaskID]; - - if (Task == nullptr) { - return; - } - - TaskHistoryReplyHeader_Struct *task_history_reply; - TaskHistoryReplyData1_Struct *task_history_reply_data_1; - TaskHistoryReplyData2_Struct *task_history_reply_data_2; - - char *reply; - - int completed_activity_count = 0; - int packet_length = sizeof(TaskHistoryReplyHeader_Struct); - - for (int i = 0; i < Task->activity_count; i++) { - if (completed_tasks[adjusted_task_index].activity_done[i]) { - completed_activity_count++; - packet_length = packet_length + sizeof(TaskHistoryReplyData1_Struct) + - Task->activity_information[i].target_name.size() + 1 + - Task->activity_information[i].item_list.size() + 1 + - sizeof(TaskHistoryReplyData2_Struct) + - Task->activity_information[i].description_override.size() + 1; - } - } - - auto outapp = new EQApplicationPacket(OP_TaskHistoryReply, packet_length); - - task_history_reply = (TaskHistoryReplyHeader_Struct *) outapp->pBuffer; - - // We use the TaskIndex the client sent in the request - task_history_reply->TaskID = task_index; - task_history_reply->ActivityCount = completed_activity_count; - - reply = (char *) task_history_reply + sizeof(TaskHistoryReplyHeader_Struct); - - for (int i = 0; i < Task->activity_count; i++) { - if (completed_tasks[adjusted_task_index].activity_done[i]) { - task_history_reply_data_1 = (TaskHistoryReplyData1_Struct *) reply; - task_history_reply_data_1->ActivityType = Task->activity_information[i].activity_type; - reply = (char *) task_history_reply_data_1 + sizeof(TaskHistoryReplyData1_Struct); - VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].target_name.c_str()); - VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].item_list.c_str()); - task_history_reply_data_2 = (TaskHistoryReplyData2_Struct *) reply; - task_history_reply_data_2->GoalCount = Task->activity_information[i].goal_count; - task_history_reply_data_2->unknown04 = 0xffffffff; - task_history_reply_data_2->unknown08 = 0xffffffff; - task_history_reply_data_2->ZoneID = Task->activity_information[i].zone_ids.empty() ? 0 - : Task->activity_information[i].zone_ids.front(); - task_history_reply_data_2->unknown16 = 0x00000000; - reply = (char *) task_history_reply_data_2 + sizeof(TaskHistoryReplyData2_Struct); - VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].description_override.c_str()); - } - } - - - client->QueuePacket(outapp); - safe_delete(outapp); -} - void Client::SendTaskActivityComplete( int task_id, int activity_id, @@ -3033,1089 +118,6 @@ void Client::SendTaskFailed(int task_id, int task_index, TaskType task_type) safe_delete(outapp); } -void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *client_task_state) -{ - int packet_length = 4; - //vector::const_iterator iterator; - // The client only display the first 50 Completed Tasks send, so send the 50 most recent - int first_task_to_send = 0; - int last_task_to_send = client_task_state->completed_tasks.size(); - if (client_task_state->completed_tasks.size() > 50) { - first_task_to_send = client_task_state->completed_tasks.size() - 50; - } - - LogTasks( - "[SendCompletedTasksToClient] completed task count [{}] first tank to send is [{}] last is [{}]", - client_task_state->completed_tasks.size(), - first_task_to_send, - last_task_to_send - ); - - /* - for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { - int task_id = (*iterator).task_id; - if(Tasks[task_id] == nullptr) continue; - PacketLength = PacketLength + 8 + strlen(Tasks[task_id]->title) + 1; - } - */ - for (int i = first_task_to_send; i < last_task_to_send; i++) { - int TaskID = client_task_state->completed_tasks[i].task_id; - if (p_task_data[TaskID] == nullptr) { continue; } - packet_length = packet_length + 8 + p_task_data[TaskID]->title.size() + 1; - } - - auto outapp = new EQApplicationPacket(OP_CompletedTasks, packet_length); - char *buf = (char *) outapp->pBuffer; - - //*(uint32 *)buf = activity_state->CompletedTasks.size(); - *(uint32 *) buf = last_task_to_send - first_task_to_send; - buf = buf + 4; - //for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { - // int task_id = (*iterator).task_id; - for (int i = first_task_to_send; i < last_task_to_send; i++) { - int task_id = client_task_state->completed_tasks[i].task_id; - if (p_task_data[task_id] == nullptr) { continue; } - *(uint32 *) buf = task_id; - buf = buf + 4; - - sprintf(buf, "%s", p_task_data[task_id]->title.c_str()); - buf = buf + strlen(buf) + 1; - //*(uint32 *)buf = (*iterator).CompletedTime; - *(uint32 *) buf = client_task_state->completed_tasks[i].completed_time; - buf = buf + 4; - } - - c->QueuePacket(outapp); - safe_delete(outapp); -} - - -void TaskManager::SendTaskActivityShort(Client *client, int task_id, int activity_id, int client_task_index) -{ - // This activity_information Packet is sent for activities that have not yet been unlocked and appear as ??? - // in the client. - - TaskActivityShort_Struct *task_activity_short; - if (client->ClientVersionBit() & EQ::versions::maskRoFAndLater) { - auto outapp = new EQApplicationPacket(OP_TaskActivity, 25); - outapp->WriteUInt32(client_task_index); - outapp->WriteUInt32(static_cast(p_task_data[task_id]->type)); - outapp->WriteUInt32(task_id); - outapp->WriteUInt32(activity_id); - outapp->WriteUInt32(0); - outapp->WriteUInt32(0xffffffff); - outapp->WriteUInt8(0); - client->FastQueuePacket(&outapp); - - return; - } - - auto outapp = new EQApplicationPacket(OP_TaskActivity, sizeof(TaskActivityShort_Struct)); - - task_activity_short = (TaskActivityShort_Struct *) outapp->pBuffer; - task_activity_short->TaskSequenceNumber = client_task_index; - task_activity_short->unknown2 = static_cast(p_task_data[task_id]->type); - task_activity_short->TaskID = task_id; - task_activity_short->ActivityID = activity_id; - task_activity_short->unknown3 = 0x000000; - task_activity_short->ActivityType = 0xffffffff; - task_activity_short->unknown4 = 0x00000000; - - client->QueuePacket(outapp); - safe_delete(outapp); -} - - -void TaskManager::SendTaskActivityLong( - Client *client, - int task_id, - int activity_id, - int client_task_index, - bool optional, - bool task_complete -) -{ - - if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF) { - SendTaskActivityNew(client, task_id, activity_id, client_task_index, optional, task_complete); - return; - } - - SerializeBuffer buf(100); - - buf.WriteUInt32(client_task_index); - buf.WriteUInt32(static_cast(p_task_data[task_id]->type)); - buf.WriteUInt32(task_id); - buf.WriteUInt32(activity_id); - buf.WriteUInt32(0); // unknown3 - - // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes - // no difference to the client. All activity_information updates will be done based on our interal activity_information types. - if ((p_task_data[task_id]->activity_information[activity_id].activity_type > 0) && - p_task_data[task_id]->activity_information[activity_id].activity_type < 100) { - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].activity_type); - } - else { - buf.WriteUInt32(ActivityCastOn); - } // w/e! - - buf.WriteUInt32(optional); - buf.WriteUInt32(0); // solo, group, raid - - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].target_name); // target name string - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].item_list); // item name list - - if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].goal_count); - } - else { - // For our internal type GiveCash, where the goal count has the amount of cash that must be given, - // we don't want the donecount and goalcount fields cluttered up with potentially large numbers, so we just - // send a goalcount of 1, and a bit further down, a donecount of 1 if the activity_information is complete, 0 otherwise. - // The text3 field should decribe the exact activity_information goal, e.g. give 3500gp to Hasten Bootstrutter. - buf.WriteUInt32(1); - } - - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].skill_id); - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].spell_id); - buf.WriteUInt32( - p_task_data[task_id]->activity_information[activity_id].zone_ids.empty() ? 0 - : p_task_data[task_id]->activity_information[activity_id].zone_ids.front()); - buf.WriteUInt32(0); - - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].description_override); - - if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { - buf.WriteUInt32(client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id)); - } - else { - // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. - buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= - p_task_data[task_id]->activity_information[activity_id].goal_count)); - } - - buf.WriteUInt32(1); // unknown - - auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); - - client->QueuePacket(outapp); - safe_delete(outapp); - -} - -// Used only by RoF+ Clients -void TaskManager::SendTaskActivityNew( - Client *client, - int task_id, - int activity_id, - int client_task_index, - bool optional, - bool task_complete -) -{ - SerializeBuffer buf(100); - - buf.WriteUInt32(client_task_index); // TaskSequenceNumber - buf.WriteUInt32(static_cast(p_task_data[task_id]->type)); // task type - buf.WriteUInt32(task_id); - buf.WriteUInt32(activity_id); - buf.WriteUInt32(0); // unknown3 - - // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes - // no difference to the client. All activity_information updates will be done based on our interal activity_information types. - if ((p_task_data[task_id]->activity_information[activity_id].activity_type > 0) && - p_task_data[task_id]->activity_information[activity_id].activity_type < 100) { - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].activity_type); - } - else { - buf.WriteUInt32(ActivityCastOn); - } // w/e! - - buf.WriteUInt8(optional); - buf.WriteUInt32(0); // solo, group, raid - - // One of these unknown fields maybe related to the 'Use On' activity_information types - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].target_name); // target name string - - buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].item_list); // item name list - - // Goal Count - if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].goal_count); - } - else { - buf.WriteUInt32(1); - } // GoalCount - - // skill ID list ; separated - buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].skill_list); - - // spelll ID list ; separated -- unsure wtf we're doing here - buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].spell_list); - - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].zones); - buf.WriteUInt32(0); // unknown7 - - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].description_override); // description override - - if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { - buf.WriteUInt32( - client->GetTaskActivityDoneCount( - p_task_data[task_id]->type, - client_task_index, - activity_id - )); // done_count - } - else { - // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. - buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= - p_task_data[task_id]->activity_information[activity_id].goal_count)); - } - - buf.WriteUInt8(1); // unknown9 - - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].zones); - - auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); - - client->QueuePacket(outapp); - safe_delete(outapp); - -} - -void TaskManager::SendActiveTasksToClient(Client *client, bool task_complete) -{ - auto state = client->GetTaskState(); - if (!state) { - return; - } - - for (int task_index = 0; task_index < MAXACTIVEQUESTS + 1; task_index++) { - int task_id = state->active_tasks[task_index].task_id; - if ((task_id == 0) || (p_task_data[task_id] == 0)) { - continue; - } - int start_time = state->active_tasks[task_index].accepted_time; - - SendActiveTaskDescription( - client, task_id, state->active_tasks[task_index], start_time, p_task_data[task_id]->duration, - false - ); - LogTasks("[SendActiveTasksToClient] task_id [{}] activity_count [{}]", task_id, GetActivityCount(task_id)); - - int sequence = 0; - int fixed_index = p_task_data[task_id]->type == TaskType::Task ? 0 : task_index - 1; // hmmm fuck - for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { - if (client->GetTaskActivityState(p_task_data[task_id]->type, fixed_index, activity_id) != ActivityHidden) { - LogTasks( - "[SendActiveTasksToClient] (Long Update) task_id [{}] activity_id [{}] fixed_index [{}] task_complete [{}]", - task_id, - activity_id, - fixed_index, - task_complete ? "true" : "false" - ); - - if (activity_id == GetActivityCount(task_id) - 1) { - SendTaskActivityLong( - client, - task_id, - activity_id, - fixed_index, - p_task_data[task_id]->activity_information[activity_id].optional, - task_complete - ); - } - else { - SendTaskActivityLong( - client, - task_id, - activity_id, - fixed_index, - p_task_data[task_id]->activity_information[activity_id].optional, - 0 - ); - } - } - else { - LogTasks( - "[SendActiveTasksToClient] (Short Update) task_id [{}] activity_id [{}] fixed_index [{}]", - task_id, - activity_id, - fixed_index - ); - - SendTaskActivityShort(client, task_id, activity_id, fixed_index); - } - sequence++; - } - } -} - -void TaskManager::SendSingleActiveTaskToClient( - Client *client, ClientTaskInformation &task_info, bool task_complete, - bool bring_up_task_journal -) -{ - int task_id = task_info.task_id; - if (task_id == 0 || p_task_data[task_id] == nullptr) { - return; - } - - int start_time = task_info.accepted_time; - SendActiveTaskDescription( - client, - task_id, - task_info, - start_time, - p_task_data[task_id]->duration, - bring_up_task_journal - ); - Log(Logs::General, - Logs::Tasks, - "[UPDATE] SendSingleActiveTasksToClient: Task %i, Activities: %i", - task_id, - GetActivityCount(task_id)); - - for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { - if (task_info.activity[activity_id].activity_state != ActivityHidden) { - LogTasks("[SendSingleActiveTaskToClient] Long [{}] [{}] complete [{}]", - task_id, - activity_id, - task_complete); - if (activity_id == GetActivityCount(task_id) - 1) { - SendTaskActivityLong( - client, task_id, activity_id, task_info.slot, - p_task_data[task_id]->activity_information[activity_id].optional, task_complete - ); - } - else { - SendTaskActivityLong( - client, task_id, activity_id, task_info.slot, - p_task_data[task_id]->activity_information[activity_id].optional, 0 - ); - } - } - else { - LogTasks("[SendSingleActiveTaskToClient] Short [{}] [{}]", task_id, activity_id); - SendTaskActivityShort(client, task_id, activity_id, task_info.slot); - } - } -} - -void TaskManager::SendActiveTaskDescription( - Client *client, - int task_id, - ClientTaskInformation &task_info, - int start_time, - int duration, - bool bring_up_task_journal -) -{ - if ((task_id < 1) || (task_id >= MAXTASKS) || !p_task_data[task_id]) { - return; - } - - int packet_length = sizeof(TaskDescriptionHeader_Struct) + p_task_data[task_id]->title.length() + 1 - + sizeof(TaskDescriptionData1_Struct) + p_task_data[task_id]->description.length() + 1 - + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); - - // If there is an item make the reward text into a link to the item (only the first item if a list - // is specified). I have been unable to get multiple item links to work. - // - if (p_task_data[task_id]->reward_id && p_task_data[task_id]->item_link.empty()) { - int item_id = 0; - // If the reward is a list of items, and the first entry on the list is valid - if (p_task_data[task_id]->reward_method == METHODSINGLEID) { - item_id = p_task_data[task_id]->reward_id; - } - else if (p_task_data[task_id]->reward_method == METHODLIST) { - item_id = goal_list_manager.GetFirstEntry(p_task_data[task_id]->reward_id); - if (item_id < 0) { - item_id = 0; - } - } - - if (item_id) { - const EQ::ItemData *reward_item = database.GetItem(item_id); - - EQ::SayLinkEngine linker; - linker.SetLinkType(EQ::saylink::SayLinkItemData); - linker.SetItemData(reward_item); - linker.SetTaskUse(); - p_task_data[task_id]->item_link = linker.GenerateLink(); - } - } - - packet_length += p_task_data[task_id]->reward.length() + 1 + p_task_data[task_id]->item_link.length() + 1; - - char *Ptr; - TaskDescriptionHeader_Struct *task_description_header; - TaskDescriptionData1_Struct *tdd1; - TaskDescriptionData2_Struct *tdd2; - TaskDescriptionTrailer_Struct *tdt; - - auto outapp = new EQApplicationPacket(OP_TaskDescription, packet_length); - - task_description_header = (TaskDescriptionHeader_Struct *) outapp->pBuffer; - - task_description_header->SequenceNumber = task_info.slot; - task_description_header->TaskID = task_id; - task_description_header->open_window = bring_up_task_journal; - task_description_header->task_type = static_cast(p_task_data[task_id]->type); - task_description_header->reward_type = 0; // TODO: 4 says Radiant Crystals else Ebon Crystals when shared task - - Ptr = (char *) task_description_header + sizeof(TaskDescriptionHeader_Struct); - - sprintf(Ptr, "%s", p_task_data[task_id]->title.c_str()); - Ptr += p_task_data[task_id]->title.length() + 1; - - tdd1 = (TaskDescriptionData1_Struct *) Ptr; - - tdd1->Duration = duration; - tdd1->dur_code = static_cast(p_task_data[task_id]->duration_code); - - tdd1->StartTime = start_time; - - Ptr = (char *) tdd1 + sizeof(TaskDescriptionData1_Struct); - - sprintf(Ptr, "%s", p_task_data[task_id]->description.c_str()); - Ptr += p_task_data[task_id]->description.length() + 1; - - tdd2 = (TaskDescriptionData2_Struct *) Ptr; - - // we have this reward stuff! - // if we ever don't hardcode this, TaskDescriptionTrailer_Struct will need to be fixed since - // "has_reward_selection" is after this bool! Smaller packet when this is 0 - tdd2->has_rewards = 1; - - tdd2->coin_reward = p_task_data[task_id]->cash_reward; - tdd2->xp_reward = p_task_data[task_id]->experience_reward ? 1 : 0; // just booled - tdd2->faction_reward = p_task_data[task_id]->faction_reward ? 1 : 0; // faction booled - - Ptr = (char *) tdd2 + sizeof(TaskDescriptionData2_Struct); - - // we actually have 2 strings here. One is max length 96 and not parsed for item links - // We actually skipped past that string incorrectly before, so TODO: fix item link string - sprintf(Ptr, "%s", p_task_data[task_id]->reward.c_str()); - Ptr += p_task_data[task_id]->reward.length() + 1; - - // second string is parsed for item links - sprintf(Ptr, "%s", p_task_data[task_id]->item_link.c_str()); - Ptr += p_task_data[task_id]->item_link.length() + 1; - - tdt = (TaskDescriptionTrailer_Struct *) Ptr; - tdt->Points = 0x00000000; // Points Count TODO: this does have a visible affect on the client ... - tdt->has_reward_selection = 0; // TODO: new rewards window - - client->QueuePacket(outapp); - safe_delete(outapp); -} - -bool ClientTaskState::IsTaskActivityCompleted(TaskType task_type, int index, int activity_id) -{ - switch (task_type) { - case TaskType::Task: - if (index != 0) { - return false; - } - return active_task.activity[activity_id].activity_state == ActivityCompleted; - case TaskType::Shared: - return false; // TODO: shared tasks - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) { - return active_quests[index].activity[activity_id].activity_state == ActivityCompleted; - } - default: - return false; - } - -} - -// should we be defaulting to hidden? -ActivityState ClientTaskState::GetTaskActivityState(TaskType task_type, int index, int activity_id) -{ - switch (task_type) { - case TaskType::Task: - if (index != 0) { - return ActivityHidden; - } - return active_task.activity[activity_id].activity_state; - case TaskType::Shared: - return ActivityHidden; // TODO: shared tasks - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) { - return active_quests[index].activity[activity_id].activity_state; - } - default: - return ActivityHidden; - } -} - -int ClientTaskState::GetTaskActivityDoneCount(TaskType task_type, int index, int activity_id) -{ - switch (task_type) { - case TaskType::Task: - if (index != 0) { - return 0; - } - return active_task.activity[activity_id].done_count; - case TaskType::Shared: - return 0; // TODO: shared tasks - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) { - return active_quests[index].activity[activity_id].done_count; - } - default: - return 0; - } -} - -int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id) -{ - if (active_task.task_id == task_id) { - return active_task.activity[activity_id].done_count; - } - - // TODO: shared tasks - - int active_task_index = -1; - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { - active_task_index = i; - break; - } - } - - if (active_task_index == -1) { - return 0; - } - - if (active_quests[active_task_index].activity[activity_id].done_count) { - return active_quests[active_task_index].activity[activity_id].done_count; - } - else { - return 0; - } -} - -int ClientTaskState::GetTaskStartTime(TaskType task_type, int index) -{ - switch (task_type) { - case TaskType::Task: - return active_task.accepted_time; - case TaskType::Quest: - return active_quests[index].accepted_time; - case TaskType::Shared: // TODO - default: - return -1; - } -} - -void ClientTaskState::CancelAllTasks(Client *client) -{ - - // This method exists solely to be called during #task reloadall - // It removes tasks from the in-game client state ready for them to be - // resent to the client, in case an updated task fails to load - - CancelTask(client, 0, TaskType::Task, false); - active_task.task_id = TASKSLOTEMPTY; - - for (int i = 0; i < MAXACTIVEQUESTS; i++) - if (active_quests[i].task_id != TASKSLOTEMPTY) { - CancelTask(client, i, TaskType::Quest, false); - active_quests[i].task_id = TASKSLOTEMPTY; - } - - // TODO: shared -} - -void ClientTaskState::CancelTask(Client *client, int sequence_number, TaskType task_type, bool remove_from_db) -{ - auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); - - CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; - cts->SequenceNumber = sequence_number; - cts->type = static_cast(task_type); - - Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask"); - - client->QueuePacket(outapp); - safe_delete(outapp); - - if (remove_from_db) { - RemoveTask(client, sequence_number, task_type); - } -} - -void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType task_type) -{ - int character_id = client->CharacterID(); - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState Cancel Task %i ", sequence_number); - - int task_id = -1; - switch (task_type) { - case TaskType::Task: - if (sequence_number == 0) { - task_id = active_task.task_id; - } - break; - case TaskType::Quest: - if (sequence_number < MAXACTIVEQUESTS) { - task_id = active_quests[sequence_number].task_id; - } - break; - case TaskType::Shared: // TODO: - default: - break; - } - - 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, static_cast(task_type)) - ); - - switch (task_type) { - case TaskType::Task: - active_task.task_id = TASKSLOTEMPTY; - break; - case TaskType::Shared: - break; // TODO: shared tasks - case TaskType::Quest: - active_quests[sequence_number].task_id = TASKSLOTEMPTY; - active_task_count--; - break; - default: - break; - } -} - -void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) -{ - auto task_type = p_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) { - case TaskType::Task: { - if (active_task.task_id == task_id) { - auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); - CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; - cts->SequenceNumber = 0; - cts->type = static_cast(task_type); - LogTasks("[UPDATE] RemoveTaskByTaskID found Task [{}]", task_id); - client->QueuePacket(outapp); - safe_delete(outapp); - active_task.task_id = TASKSLOTEMPTY; - } - break; - } - case TaskType::Shared: { - break; // TODO: shared tasks - } - case TaskType::Quest: { - for (int active_quest = 0; active_quest < MAXACTIVEQUESTS; active_quest++) { - if (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); - LogTasks("[UPDATE] RemoveTaskByTaskID found Quest [{}] at index [{}]", task_id, active_quest); - active_quests[active_quest].task_id = TASKSLOTEMPTY; - active_task_count--; - client->QueuePacket(outapp); - safe_delete(outapp); - } - } - } - default: { - break; - } - } -} - -void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id, bool enforce_level_requirement) -{ - if (!p_task_manager || task_id < 0 || task_id >= MAXTASKS) { - client->Message(Chat::Red, "Task system not functioning, or task_id %i out of range.", task_id); - return; - } - - auto task = p_task_manager->p_task_data[task_id]; - - if (task == nullptr) { - client->Message(Chat::Red, "Invalid task_id %i", task_id); - return; - } - - bool max_tasks = false; - - switch (task->type) { - case TaskType::Task: - if (active_task.task_id != TASKSLOTEMPTY) { - max_tasks = true; - } - break; - case TaskType::Shared: // TODO: shared tasks - // if (something) - max_tasks = true; - break; - case TaskType::Quest: - if (active_task_count == MAXACTIVEQUESTS) { - max_tasks = true; - } - break; - default: - break; - } - - if (max_tasks) { - client->Message( - Chat::Red, - "You already have the maximum allowable number of active tasks (%i)", - MAXACTIVEQUESTS - ); - return; - } - - // only Quests can have more than one, so don't need to check others - if (task->type == TaskType::Quest) { - for (auto &active_quest : active_quests) { - if (active_quest.task_id == task_id) { - client->Message(Chat::Red, "You have already been assigned this task."); - return; - } - } - } - - if (enforce_level_requirement && !p_task_manager->ValidateLevel(task_id, client->GetLevel())) { - client->Message(Chat::Red, "You are outside the level range of this task."); - return; - } - - if (!p_task_manager->IsTaskRepeatable(task_id) && IsTaskCompleted(task_id)) { - return; - } - - // We do it this way, because when the Client cancels a task, it retains the sequence number of the remaining - // tasks in it's window, until something causes the TaskDescription packets to be sent again. We could just - // resend all the active task data to the client when it cancels a task, but that could be construed as a - // waste of bandwidth. - // - ClientTaskInformation *active_slot = nullptr; - switch (task->type) { - case TaskType::Task: - active_slot = &active_task; - break; - case TaskType::Shared: // TODO: shared - active_slot = nullptr; - break; - case TaskType::Quest: - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] ClientTaskState Looking for free slot in slot %i, found task_id of %i", i, - active_quests[i].task_id); - if (active_quests[i].task_id == 0) { - active_slot = &active_quests[i]; - break; - } - } - break; - default: - break; - } - - // This shouldn't happen unless there is a bug in the handling of ActiveTaskCount somewhere - if (active_slot == nullptr) { - client->Message( - Chat::Red, - "You already have the maximum allowable number of active tasks (%i)", - MAXACTIVEQUESTS - ); - return; - } - - active_slot->task_id = task_id; - active_slot->accepted_time = time(nullptr); - active_slot->updated = true; - active_slot->current_step = -1; - - for (int activity_id = 0; activity_id < p_task_manager->p_task_data[task_id]->activity_count; activity_id++) { - active_slot->activity[activity_id].activity_id = activity_id; - active_slot->activity[activity_id].done_count = 0; - active_slot->activity[activity_id].activity_state = ActivityHidden; - active_slot->activity[activity_id].updated = true; - } - - UnlockActivities(client->CharacterID(), *active_slot); - - if (task->type == TaskType::Quest) { - active_task_count++; - } - - p_task_manager->SendSingleActiveTaskToClient(client, *active_slot, false, true); - client->Message( - Chat::White, - "You have been assigned the task '%s'.", - p_task_manager->p_task_data[task_id]->title.c_str() - ); - p_task_manager->SaveClientState(client, this); - std::string buf = std::to_string(task_id); - - NPC *npc = entity_list.GetID(npc_type_id)->CastToNPC(); - if (npc) { - parse->EventNPC(EVENT_TASK_ACCEPTED, npc, client, buf.c_str(), 0); - } -} - -void ClientTaskState::ProcessTaskProximities(Client *client, float x, float y, float z) -{ - float last_x = client->ProximityX(); - float last_y = client->ProximityY(); - float last_z = client->ProximityZ(); - - if ((last_x == x) && (last_y == y) && (last_z == z)) { - return; - } - - LogTasksDetail("[ProcessTaskProximities] Checking proximities for Position x[{}] y[{}] z[{}]", x, y, z); - int explore_id = p_task_manager->proximity_manager.CheckProximities(x, y, z); - if (explore_id > 0) { - LogTasksDetail( - "[ProcessTaskProximities] Position x[{}] y[{}] z[{}] is within proximity explore_id [{}]", - x, - y, - z, - explore_id - ); - - UpdateTasksOnExplore(client, explore_id); - } -} - -TaskGoalListManager::TaskGoalListManager() -{ - goal_lists_count = 0; -} - -TaskGoalListManager::~TaskGoalListManager() {} - -bool TaskGoalListManager::LoadLists() -{ - task_goal_lists.clear(); - goal_lists_count = 0; - - std::string query = "SELECT `listid`, COUNT(`entry`) FROM `goallists` GROUP by `listid` ORDER BY `listid`"; - auto results = content_db.QueryDatabase(query); - if (!results.Success()) { - return false; - } - - goal_lists_count = results.RowCount(); - LogTasks("Loaded [{}] GoalLists", goal_lists_count); - - task_goal_lists.reserve(goal_lists_count); - - int list_index = 0; - for (auto row = results.begin(); row != results.end(); ++row) { - int list_id = atoi(row[0]); - int list_size = atoi(row[1]); - - task_goal_lists.push_back({list_id, 0, 0}); - - task_goal_lists[list_index].GoalItemEntries.reserve(list_size); - - list_index++; - } - - auto goal_lists = GoallistsRepository::GetWhere(content_db, "TRUE ORDER BY listid, entry ASC"); - for (list_index = 0; list_index < goal_lists_count; list_index++) { - - int list_id = task_goal_lists[list_index].ListID; - - for (auto &entry: goal_lists) { - if (entry.listid == list_id) { - if (entry.entry < task_goal_lists[list_index].Min) { - task_goal_lists[list_index].Min = entry.entry; - } - - if (entry.entry > task_goal_lists[list_index].Max) { - task_goal_lists[list_index].Max = entry.entry; - } - - task_goal_lists[list_index].GoalItemEntries.push_back(entry.entry); - - LogTasksDetail( - "Goal list index [{}] loading list [{}] entry [{}]", - list_index, - list_id, - entry.entry - ); - } - } - } - - return true; - -} - -int TaskGoalListManager::GetListByID(int list_id) -{ - - // Find the list with the specified ListID and return the index - auto it = std::find_if( - task_goal_lists.begin(), - task_goal_lists.end(), - [list_id](const TaskGoalList_Struct &t) { return t.ListID == list_id; } - ); - - if (it == task_goal_lists.end()) { - return -1; - } - - return std::distance(task_goal_lists.begin(), it); -} - -int TaskGoalListManager::GetFirstEntry(int list_id) -{ - int list_by_id = GetListByID(list_id); - - if ((list_by_id < 0) || (list_by_id >= goal_lists_count)) { - return -1; - } - - if (task_goal_lists[list_by_id].GoalItemEntries.empty()) { - return -1; - } - - return task_goal_lists[list_by_id].GoalItemEntries[0]; -} - -std::vector TaskGoalListManager::GetListContents(int list_index) -{ - std::vector list_contents; - int list_by_id = GetListByID(list_index); - - if ((list_by_id < 0) || (list_by_id >= goal_lists_count)) { - return list_contents; - } - - list_contents = task_goal_lists[list_by_id].GoalItemEntries; - - return list_contents; -} - -bool TaskGoalListManager::IsInList(int list_id, int entry) -{ - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i)", list_id, entry); - - int list_index = GetListByID(list_id); - - if ((list_index < 0) || (list_index >= goal_lists_count)) { - return false; - } - - if ((entry < task_goal_lists[list_index].Min) || (entry > task_goal_lists[list_index].Max)) { - return false; - } - - int first_entry = 0; - auto &task = task_goal_lists[list_index]; - auto it = std::find(task.GoalItemEntries.begin(), task.GoalItemEntries.end(), entry); - - if (it == task.GoalItemEntries.end()) { - return false; - } - - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i) returning true", list_index, entry); - - return true; -} - -TaskProximityManager::TaskProximityManager() -{ - - -} - -TaskProximityManager::~TaskProximityManager() -{ - - -} - -bool TaskProximityManager::LoadProximities(int zone_id) -{ - TaskProximity proximity{}; - task_proximities.clear(); - - auto proximities = ProximitiesRepository::GetWhere( - content_db, - fmt::format("zoneid = {} ORDER BY `zoneid` ASC", zone_id) - ); - - for (auto &row: proximities) { - proximity.explore_id = row.exploreid; - proximity.min_x = row.minx; - proximity.max_x = row.maxx; - proximity.min_y = row.miny; - proximity.max_y = row.maxy; - proximity.min_z = row.minz; - proximity.max_z = row.maxz; - - task_proximities.push_back(proximity); - } - - LogTasks("Loaded [{}] Task Proximities", proximities.size()); - - return true; -} - -int TaskProximityManager::CheckProximities(float x, float y, float z) -{ - for (auto &task_proximity : task_proximities) { - - TaskProximity *p_proximity = &task_proximity; - - Log( - Logs::General, - Logs::Tasks, - "[Proximity] Checking %8.3f, %8.3f, %8.3f against %8.3f, %8.3f, %8.3f, %8.3f, %8.3f, %8.3f", - x, - y, - z, - p_proximity->min_x, - p_proximity->max_x, - p_proximity->min_y, - p_proximity->max_y, - p_proximity->min_z, - p_proximity->max_z - ); - - if (x < p_proximity->min_x || x > p_proximity->max_x || y < p_proximity->min_y || y > p_proximity->max_y || - z < p_proximity->min_z || z > p_proximity->max_z) { - continue; - } - - return p_proximity->explore_id; - } - - return 0; -} diff --git a/zone/tasks.h b/zone/tasks.h index 17f95c6e7..cacdaacb9 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -26,60 +26,13 @@ #define RELOADTASKSETS 3 class Client; - class Mob; namespace EQ { class ItemInstance; } -struct TaskGoalList_Struct { - int ListID; - int Min, Max; - std::vector GoalItemEntries; -}; -// This is used for handling lists, loading them from the database, searching them. -// Used for lists of NPCs to kill, items to loot, etc, as well as lists of items to -// reward the player with on completion of the task. -class TaskGoalListManager { - -public: - TaskGoalListManager(); - ~TaskGoalListManager(); - bool LoadLists(); - int GetListByID(int list_id); - bool IsInList(int list_id, int entry); - int GetFirstEntry(int list_id); - std::vector GetListContents(int list_index); - -private: - std::vector task_goal_lists; - int goal_lists_count; -}; - -struct TaskProximity { - int explore_id; - float min_x; - float max_x; - float min_y; - float max_y; - float min_z; - float max_z; -}; - -// This class is used for managing proximities so that Quest NPC proximities don't need to be used. -class TaskProximityManager { - -public: - TaskProximityManager(); - ~TaskProximityManager(); - bool LoadProximities(int zone_id); - int CheckProximities(float x, float y, float z); - -private: - std::vector task_proximities; -}; typedef enum { METHODSINGLEID = 0, @@ -200,182 +153,4 @@ struct CompletedTaskInformation { bool activity_done[MAXACTIVITIESPERTASK]; }; -class ClientTaskState { - -public: - ClientTaskState(); - ~ClientTaskState(); - void ShowClientTasks(Client *client); - inline int GetActiveTaskCount() { return active_task_count; } - int GetActiveTaskID(int index); - bool IsTaskActivityCompleted(TaskType task_type, int index, int activity_id); - int GetTaskActivityDoneCount(TaskType task_type, int index, int activity_id); - int GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id); - int GetTaskStartTime(TaskType task_type, int index); - void AcceptNewTask(Client *client, int task_id, int npc_type_id, bool enforce_level_requirement = false); - void FailTask(Client *client, int task_id); - int TaskTimeLeft(int task_id); - int IsTaskCompleted(int task_id); - bool IsTaskActive(int task_id); - bool IsTaskActivityActive(int task_id, int activity_id); - ActivityState GetTaskActivityState(TaskType task_type, int index, int activity_id); - void UpdateTaskActivity(Client *client, int task_id, int activity_id, int count, bool ignore_quest_update = false); - void ResetTaskActivity(Client *client, int task_id, int activity_id); - void CancelTask(Client *client, int sequence_number, TaskType task_type, bool remove_from_db = true); - void CancelAllTasks(Client *client); - void RemoveTask(Client *client, int sequence_number, TaskType task_type); - void RemoveTaskByTaskID(Client *client, uint32 task_id); - bool UpdateTasksByNPC(Client *client, int activity_type, int npc_type_id); - void UpdateTasksOnKill(Client *client, int npc_type_id); - void UpdateTasksForItem(Client *client, ActivityType activity_type, int item_id, int count = 1); - void UpdateTasksOnExplore(Client *client, int explore_id); - bool UpdateTasksOnSpeakWith(Client *client, int npc_type_id); - bool UpdateTasksOnDeliver(Client *client, std::list &items, int cash, int npc_type_id); - void UpdateTasksOnTouch(Client *client, int zone_id); - void ProcessTaskProximities(Client *client, float x, float y, float z); - bool TaskOutOfTime(TaskType task_type, int index); - void TaskPeriodicChecks(Client *client); - void SendTaskHistory(Client *client, int task_index); - void RewardTask(Client *client, TaskInformation *task_information); - void EnableTask(int character_id, int task_count, int *task_list); - void DisableTask(int character_id, int task_count, int *task_list); - bool IsTaskEnabled(int task_id); - int EnabledTaskCount(int task_set_id); - int ActiveSpeakTask(int npc_type_id); - int ActiveSpeakActivity(int npc_type_id, int task_id); - int ActiveTasksInSet(int task_set_id); - int CompletedTasksInSet(int task_set_id); - bool HasSlotForTask(TaskInformation *task); - - inline bool HasFreeTaskSlot() { return active_task.task_id == TASKSLOTEMPTY; } - - friend class TaskManager; - -private: - bool UnlockActivities(int character_id, ClientTaskInformation &task_info); - void IncrementDoneCount( - Client *client, - TaskInformation *task_information, - int task_index, - int activity_id, - int count = 1, - bool ignore_quest_update = false - ); - inline ClientTaskInformation *GetClientTaskInfo(TaskType task_type, int index) - { - ClientTaskInformation *info = nullptr; - switch (task_type) { - case TaskType::Task: - if (index == 0) { - info = &active_task; - } - break; - case TaskType::Shared: - break; - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) { - info = &active_quests[index]; - } - break; - default: - break; - } - return info; - } - int active_task_count; - - union { // easier to loop over - struct { - ClientTaskInformation active_task; // only one - ClientTaskInformation active_quests[MAXACTIVEQUESTS]; - }; - ClientTaskInformation active_tasks[MAXACTIVEQUESTS + 1]; - }; - // Shared tasks should be limited to 1 as well - std::vector enabled_tasks; - std::vector completed_tasks; - int last_completed_task_loaded; - bool checked_touch_activities; -}; - - -class TaskManager { - -public: - TaskManager(); - ~TaskManager(); - int GetActivityCount(int task_id); - bool LoadTasks(int single_task = 0); - void ReloadGoalLists(); - inline void LoadProximities(int zone_id) - { - proximity_manager.LoadProximities(zone_id); - } - bool LoadTaskSets(); - bool LoadClientState(Client *client, ClientTaskState *client_task_state); - bool SaveClientState(Client *client, ClientTaskState *client_task_state); - void SendTaskSelector(Client *client, Mob *mob, int task_count, int *task_list); - void SendTaskSelectorNew(Client *client, Mob *mob, int task_count, int *task_list); - bool ValidateLevel(int task_id, int player_level); - std::string GetTaskName(uint32 task_id); - TaskType GetTaskType(uint32 task_id); - void TaskSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int task_set_id); - // task list provided by QuestManager (perl/lua) - void TaskQuestSetSelector( - Client *client, - ClientTaskState *client_task_state, - Mob *mob, - int count, - int *tasks - ); - void SendActiveTasksToClient(Client *client, bool task_complete = false); - void SendSingleActiveTaskToClient( - Client *client, - ClientTaskInformation &task_info, - bool task_complete, - bool bring_up_task_journal = false - ); - void SendTaskActivityShort(Client *client, int task_id, int activity_id, int client_task_index); - void SendTaskActivityLong( - Client *client, - int task_id, - int activity_id, - int client_task_index, - bool optional, - bool task_complete = false - ); - void SendTaskActivityNew( - Client *client, - int task_id, - int activity_id, - int client_task_index, - bool optional, - bool task_complete = false - ); - void SendCompletedTasksToClient(Client *c, ClientTaskState *client_task_state); - void ExplainTask(Client *client, int task_id); - int FirstTaskInSet(int task_set); - int LastTaskInSet(int task_set); - int NextTaskInSet(int task_set, int task_id); - bool IsTaskRepeatable(int task_id); - - friend class ClientTaskState; - - -private: - TaskGoalListManager goal_list_manager; - TaskProximityManager proximity_manager; - TaskInformation *p_task_data[MAXTASKS]{}; - std::vector task_sets[MAXTASKSETS]; - void SendActiveTaskDescription( - Client *client, - int task_id, - ClientTaskInformation &task_info, - int start_time, - int duration, - bool bring_up_task_journal = false - ); - -}; - #endif From 053bdb8646c4976f7dee939567617101821a1896 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 19:19:20 -0600 Subject: [PATCH 19/26] More cleanups --- zone/CMakeLists.txt | 3 +- zone/task_client_state.cpp | 197 ++++++++++++++++++---------------- zone/task_manager.h | 1 + zone/task_proximity_manager.h | 2 +- zone/tasks.h | 15 +-- 5 files changed, 113 insertions(+), 105 deletions(-) diff --git a/zone/CMakeLists.txt b/zone/CMakeLists.txt index 2d35cf470..381123092 100644 --- a/zone/CMakeLists.txt +++ b/zone/CMakeLists.txt @@ -134,10 +134,9 @@ SET(zone_sources spell_effects.cpp spells.cpp task_client_state.cpp - task_client_state.cpp task_goal_list_manager.cpp task_manager.cpp - task_proximity_manager.cpp + task_proximity_manager.cpp tasks.cpp titles.cpp tradeskills.cpp diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp index 996ef5dcf..64c52d64b 100644 --- a/zone/task_client_state.cpp +++ b/zone/task_client_state.cpp @@ -48,15 +48,14 @@ void ClientTaskState::SendTaskHistory(Client *client, int task_index) return; } - int TaskID = completed_tasks[adjusted_task_index].task_id; - - if ((TaskID < 0) || (TaskID > MAXTASKS)) { + int task_id = completed_tasks[adjusted_task_index].task_id; + if ((task_id < 0) || (task_id > MAXTASKS)) { return; } - TaskInformation *Task = p_task_manager->p_task_data[TaskID]; + TaskInformation *p_task_data = p_task_manager->p_task_data[task_id]; - if (Task == nullptr) { + if (p_task_data == nullptr) { return; } @@ -69,14 +68,14 @@ void ClientTaskState::SendTaskHistory(Client *client, int task_index) int completed_activity_count = 0; int packet_length = sizeof(TaskHistoryReplyHeader_Struct); - for (int i = 0; i < Task->activity_count; i++) { + for (int i = 0; i < p_task_data->activity_count; i++) { if (completed_tasks[adjusted_task_index].activity_done[i]) { completed_activity_count++; packet_length = packet_length + sizeof(TaskHistoryReplyData1_Struct) + - Task->activity_information[i].target_name.size() + 1 + - Task->activity_information[i].item_list.size() + 1 + + p_task_data->activity_information[i].target_name.size() + 1 + + p_task_data->activity_information[i].item_list.size() + 1 + sizeof(TaskHistoryReplyData2_Struct) + - Task->activity_information[i].description_override.size() + 1; + p_task_data->activity_information[i].description_override.size() + 1; } } @@ -90,26 +89,25 @@ void ClientTaskState::SendTaskHistory(Client *client, int task_index) reply = (char *) task_history_reply + sizeof(TaskHistoryReplyHeader_Struct); - for (int i = 0; i < Task->activity_count; i++) { + for (int i = 0; i < p_task_data->activity_count; i++) { if (completed_tasks[adjusted_task_index].activity_done[i]) { task_history_reply_data_1 = (TaskHistoryReplyData1_Struct *) reply; - task_history_reply_data_1->ActivityType = Task->activity_information[i].activity_type; + task_history_reply_data_1->ActivityType = p_task_data->activity_information[i].activity_type; reply = (char *) task_history_reply_data_1 + sizeof(TaskHistoryReplyData1_Struct); - VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].target_name.c_str()); - VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].item_list.c_str()); + VARSTRUCT_ENCODE_STRING(reply, p_task_data->activity_information[i].target_name.c_str()); + VARSTRUCT_ENCODE_STRING(reply, p_task_data->activity_information[i].item_list.c_str()); task_history_reply_data_2 = (TaskHistoryReplyData2_Struct *) reply; - task_history_reply_data_2->GoalCount = Task->activity_information[i].goal_count; + task_history_reply_data_2->GoalCount = p_task_data->activity_information[i].goal_count; task_history_reply_data_2->unknown04 = 0xffffffff; task_history_reply_data_2->unknown08 = 0xffffffff; - task_history_reply_data_2->ZoneID = Task->activity_information[i].zone_ids.empty() ? 0 - : Task->activity_information[i].zone_ids.front(); + task_history_reply_data_2->ZoneID = p_task_data->activity_information[i].zone_ids.empty() ? 0 + : p_task_data->activity_information[i].zone_ids.front(); task_history_reply_data_2->unknown16 = 0x00000000; reply = (char *) task_history_reply_data_2 + sizeof(TaskHistoryReplyData2_Struct); - VARSTRUCT_ENCODE_STRING(reply, Task->activity_information[i].description_override.c_str()); + VARSTRUCT_ENCODE_STRING(reply, p_task_data->activity_information[i].description_override.c_str()); } } - client->QueuePacket(outapp); safe_delete(outapp); } @@ -118,8 +116,8 @@ void ClientTaskState::EnableTask(int character_id, int task_count, int *task_lis { // Check if the Task is already enabled for this client std::vector tasks_enabled; - for (int i = 0; i < task_count; i++) { + for (int i = 0; i < task_count; i++) { auto iterator = enabled_tasks.begin(); bool add_task = true; @@ -174,17 +172,17 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li // Check if the Task is enabled for this client std::vector tasks_disabled; - for (int i = 0; i < task_count; i++) { + for (int task_id = 0; task_id < task_count; task_id++) { auto iterator = enabled_tasks.begin(); bool removeTask = false; while (iterator != enabled_tasks.end()) { - if ((*iterator) == task_list[i]) { + if ((*iterator) == task_list[task_id]) { removeTask = true; break; } - if ((*iterator) > task_list[i]) { + if ((*iterator) > task_list[task_id]) { break; } @@ -193,7 +191,7 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li if (removeTask) { enabled_tasks.erase(iterator); - tasks_disabled.push_back(task_list[i]); + tasks_disabled.push_back(task_list[task_id]); } } @@ -233,14 +231,14 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li bool ClientTaskState::IsTaskEnabled(int task_id) { - std::vector::iterator Iterator; + std::vector::iterator iterator; - Iterator = enabled_tasks.begin(); + iterator = enabled_tasks.begin(); - while (Iterator != enabled_tasks.end()) { - if ((*Iterator) == task_id) { return true; } - if ((*Iterator) > task_id) { break; } - ++Iterator; + while (iterator != enabled_tasks.end()) { + if ((*iterator) == task_id) { return true; } + if ((*iterator) > task_id) { break; } + ++iterator; } return false; @@ -285,9 +283,10 @@ int ClientTaskState::ActiveTasksInSet(int task_set_id) return -1; } - int active_task_in_set_count = 0; - for (int i : p_task_manager->task_sets[task_set_id]) { - if (IsTaskActive(i)) { + int active_task_in_set_count = 0; + + for (int task_id : p_task_manager->task_sets[task_set_id]) { + if (IsTaskActive(task_id)) { active_task_in_set_count++; } } @@ -301,7 +300,8 @@ int ClientTaskState::CompletedTasksInSet(int task_set_id) return -1; } - int completed_tasks_count = 0; + int completed_tasks_count = 0; + for (int i : p_task_manager->task_sets[task_set_id]) { if (IsTaskCompleted(i)) { completed_tasks_count++; @@ -510,9 +510,9 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & completed_task_information.task_id = task_info.task_id; completed_task_information.completed_time = time(nullptr); - for (int i = 0; i < p_task_information->activity_count; i++) { - completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == - ActivityCompleted); + for (int activity_id = 0; activity_id < p_task_information->activity_count; activity_id++) { + completed_task_information.activity_done[activity_id] = + (task_info.activity[activity_id].activity_state == ActivityCompleted); } completed_tasks.push_back(completed_task_information); @@ -553,8 +553,8 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np } // loop over the union of tasks and quests - for (auto &ActiveTask : active_tasks) { - auto current_task = &ActiveTask; + for (auto &active_task : active_tasks) { + auto current_task = &active_task; if (current_task->task_id == TASKSLOTEMPTY) { continue; } @@ -1090,12 +1090,12 @@ void ClientTaskState::IncrementDoneCount( // Flag the activity_information as complete info->activity[activity_id].activity_state = ActivityCompleted; // Unlock subsequent activities for this task - bool TaskComplete = UnlockActivities(client->CharacterID(), *info); - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskCompleted is %i", TaskComplete); + bool task_complete = UnlockActivities(client->CharacterID(), *info); + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskCompleted is %i", task_complete); // and by the 'Task Stage Completed' message client->SendTaskActivityComplete(info->task_id, activity_id, task_index, task_information->type); // Send the updated task/activity_information list to the client - p_task_manager->SendSingleActiveTaskToClient(client, *info, TaskComplete, false); + p_task_manager->SendSingleActiveTaskToClient(client, *info, task_complete, false); // Inform the client the task has been updated, both by a chat message client->Message(Chat::White, "Your task '%s' has been updated.", task_information->title.c_str()); @@ -1122,7 +1122,7 @@ void ClientTaskState::IncrementDoneCount( // If this task is now complete, the Completed tasks will have been // updated in UnlockActivities. Send the completed task list to the // client. This is the same sequence the packets are sent on live. - if (TaskComplete) { + if (task_complete) { char buf[24]; snprintf( buf, @@ -1177,27 +1177,27 @@ void ClientTaskState::RewardTask(Client *client, TaskInformation *task_informati return; } - const EQ::ItemData *Item; - std::vector RewardList; + const EQ::ItemData *item_data; + std::vector reward_list; switch (task_information->reward_method) { case METHODSINGLEID: { if (task_information->reward_id) { client->SummonItem(task_information->reward_id); - Item = database.GetItem(task_information->reward_id); - if (Item) { - client->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); + item_data = database.GetItem(task_information->reward_id); + if (item_data) { + client->Message(Chat::Yellow, "You receive %s as a reward.", item_data->Name); } } break; } case METHODLIST: { - RewardList = p_task_manager->goal_list_manager.GetListContents(task_information->reward_id); - for (int i : RewardList) { - client->SummonItem(i); - Item = database.GetItem(i); - if (Item) { - client->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); + reward_list = p_task_manager->goal_list_manager.GetListContents(task_information->reward_id); + for (int item_id : reward_list) { + client->SummonItem(item_id); + item_data = database.GetItem(item_id); + if (item_data) { + client->Message(Chat::Yellow, "You receive %s as a reward.", item_data->Name); } } break; @@ -1417,9 +1417,10 @@ void ClientTaskState::UpdateTaskActivity( int count, bool ignore_quest_update /*= false*/) { - - Log( - Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState UpdateTaskActivity(%i, %i, %i).", task_id, activity_id, + LogTasks( + "[UpdateTaskActivity] Increment done count (pre) on UpdateTaskActivity task_id [{}] activity_id [{}] count [{}]", + task_id, + activity_id, count ); @@ -1451,20 +1452,19 @@ void ClientTaskState::UpdateTaskActivity( } auto info = GetClientTaskInfo(type, active_task_index); - if (info == nullptr) { return; } - TaskInformation *Task = p_task_manager->p_task_data[info->task_id]; + TaskInformation *p_task_data = p_task_manager->p_task_data[info->task_id]; // The task is invalid - if (Task == nullptr) { + if (p_task_data == nullptr) { return; } // The activity_id is out of range - if (activity_id >= Task->activity_count) { + if (activity_id >= p_task_data->activity_count) { return; } @@ -1473,13 +1473,24 @@ void ClientTaskState::UpdateTaskActivity( return; } - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment done count on UpdateTaskActivity %d %d", activity_id, count); - IncrementDoneCount(client, Task, active_task_index, activity_id, count, ignore_quest_update); + LogTasks( + "[UpdateTaskActivity] Increment done count (done) on UpdateTaskActivity task_id [{}] activity_id [{}] count [{}]", + task_id, + activity_id, + count + ); + + IncrementDoneCount(client, p_task_data, active_task_index, activity_id, count, ignore_quest_update); } void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activity_id) { - Log(Logs::General, Logs::Tasks, "[RESET] ClientTaskState ResetTaskActivity(%i, %i).", task_id, activity_id); + LogTasks( + "[ResetTaskActivity] (pre) client [{}] task_id [{}] activity_id [{}]", + client->GetCleanName(), + task_id, + activity_id + ); // Quick sanity check if (activity_id < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { @@ -1488,7 +1499,6 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit int active_task_index = -1; auto type = TaskType::Task; - if (active_task.task_id == task_id) { active_task_index = 0; } @@ -1509,7 +1519,6 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit } auto info = GetClientTaskInfo(type, active_task_index); - if (info == nullptr) { return; } @@ -1529,7 +1538,13 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit return; } - Log(Logs::General, Logs::Tasks, "[RESET] Increment done count on ResetTaskActivity"); + LogTasks( + "[ResetTaskActivity] (IncrementDoneCount) client [{}] task_id [{}] activity_id [{}]", + client->GetCleanName(), + task_id, + activity_id + ); + IncrementDoneCount( client, p_task_data, @@ -1582,13 +1597,13 @@ void ClientTaskState::ShowClientTasks(Client *client) p_task_manager->p_task_data[active_quest.task_id]->description.c_str() ); - for (int j = 0; j < p_task_manager->GetActivityCount(active_quest.task_id); j++) { + for (int activity_id = 0; activity_id < p_task_manager->GetActivityCount(active_quest.task_id); activity_id++) { client->Message( Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - active_quest.activity[j].activity_id, - active_quest.activity[j].done_count, - active_quest.activity[j].activity_state + active_quest.activity[activity_id].activity_id, + active_quest.activity[activity_id].done_count, + active_quest.activity[activity_id].activity_state ); } } @@ -1678,8 +1693,7 @@ bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) return false; } - int time_now = time(nullptr); - + int time_now = time(nullptr); TaskInformation *task_data = p_task_manager->p_task_data[info->task_id]; if (task_data == nullptr) { return false; @@ -1711,16 +1725,16 @@ void ClientTaskState::TaskPeriodicChecks(Client *client) // Check for tasks that have failed because they have not been completed in the specified time // - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == TASKSLOTEMPTY) { + for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) { + if (active_quests[task_index].task_id == TASKSLOTEMPTY) { continue; } - if (TaskOutOfTime(TaskType::Quest, i)) { + if (TaskOutOfTime(TaskType::Quest, task_index)) { // Send Red Task Failed Message - client->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); + client->SendTaskFailed(active_quests[task_index].task_id, task_index, TaskType::Quest); // Remove the task from the client - client->CancelTask(i, TaskType::Quest); + client->CancelTask(task_index, TaskType::Quest); // It is a conscious decision to only fail one task per call to this method, // otherwise the player will not see all the failed messages where multiple // tasks fail at the same time. @@ -1805,10 +1819,11 @@ int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int task_id, int activit // TODO: shared tasks - int active_task_index = -1; - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { - active_task_index = i; + int active_task_index = -1; + + for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) { + if (active_quests[task_index].task_id == task_id) { + active_task_index = task_index; break; } } @@ -1848,10 +1863,10 @@ void ClientTaskState::CancelAllTasks(Client *client) CancelTask(client, 0, TaskType::Task, false); active_task.task_id = TASKSLOTEMPTY; - for (int i = 0; i < MAXACTIVEQUESTS; i++) - if (active_quests[i].task_id != TASKSLOTEMPTY) { - CancelTask(client, i, TaskType::Quest, false); - active_quests[i].task_id = TASKSLOTEMPTY; + for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) + if (active_quests[task_index].task_id != TASKSLOTEMPTY) { + CancelTask(client, task_index, TaskType::Quest, false); + active_quests[task_index].task_id = TASKSLOTEMPTY; } // TODO: shared @@ -2049,15 +2064,15 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id active_slot = &active_task; break; case TaskType::Shared: // TODO: shared - active_slot = nullptr; + active_slot = nullptr; break; case TaskType::Quest: - for (int i = 0; i < MAXACTIVEQUESTS; i++) { + for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) { Log(Logs::General, Logs::Tasks, - "[UPDATE] ClientTaskState Looking for free slot in slot %i, found task_id of %i", i, - active_quests[i].task_id); - if (active_quests[i].task_id == 0) { - active_slot = &active_quests[i]; + "[UPDATE] ClientTaskState Looking for free slot in slot %i, found task_id of %i", task_index, + active_quests[task_index].task_id); + if (active_quests[task_index].task_id == 0) { + active_slot = &active_quests[task_index]; break; } } diff --git a/zone/task_manager.h b/zone/task_manager.h index bfbb02056..83994a058 100644 --- a/zone/task_manager.h +++ b/zone/task_manager.h @@ -12,6 +12,7 @@ #include class Client; + class Mob; class TaskManager { diff --git a/zone/task_proximity_manager.h b/zone/task_proximity_manager.h index 05a367c32..e6f42e374 100644 --- a/zone/task_proximity_manager.h +++ b/zone/task_proximity_manager.h @@ -21,7 +21,7 @@ public: int CheckProximities(float x, float y, float z); private: - std::vector task_proximities; + std::vector task_proximities; }; #endif //EQEMU_TASK_PROXIMITY_MANAGER_H diff --git a/zone/tasks.h b/zone/tasks.h index cacdaacb9..d3fed2c09 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -2,7 +2,6 @@ #define TASKS_H #include "../common/types.h" - #include #include #include @@ -10,14 +9,10 @@ #define MAXTASKS 10000 #define MAXTASKSETS 1000 -// The Client has a hard cap of 19 active quests, 29 in SoD+ -#define MAXACTIVEQUESTS 19 -// The Max Chooser (Task Selector entries) is capped at 40 in the Titanium Client. -#define MAXCHOOSERENTRIES 40 -// The Client has a hard cap of 20 activities per task. -#define MAXACTIVITIESPERTASK 20 -// This is used to determine if a client's active task slot is empty. -#define TASKSLOTEMPTY 0 +#define MAXACTIVEQUESTS 19 // The Client has a hard cap of 19 active quests, 29 in SoD+ +#define MAXCHOOSERENTRIES 40 // The Max Chooser (Task Selector entries) is capped at 40 in the Titanium Client. +#define MAXACTIVITIESPERTASK 20 // The Client has a hard cap of 20 activities per task. +#define TASKSLOTEMPTY 0 // This is used to determine if a client's active task slot is empty. // Command Codes for worldserver ServerOP_ReloadTasks #define RELOADTASKS 0 @@ -32,8 +27,6 @@ namespace EQ { class ItemInstance; } - - typedef enum { METHODSINGLEID = 0, METHODLIST = 1, From 5fba138a5a6d3b451d9e60cd73f4dbbe7888817b Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 21:14:25 -0600 Subject: [PATCH 20/26] Improve GM command interface UI --- zone/client.h | 2 +- zone/command.cpp | 139 ++++++++++++++++++++++++++----------- zone/task_client_state.cpp | 37 ++++++++-- zone/task_manager.cpp | 14 ++-- 4 files changed, 140 insertions(+), 52 deletions(-) diff --git a/zone/client.h b/zone/client.h index 65423c2b2..931cb9fd4 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1227,7 +1227,7 @@ public: return (task_state ? task_state->EnabledTaskCount(task_set_id) : -1); } inline int IsTaskCompleted(int task_id) { return (task_state ? task_state->IsTaskCompleted(task_id) : -1); } - inline void ShowClientTasks() { if (task_state) { task_state->ShowClientTasks(this); }} + inline void ShowClientTasks(Client *client) { if (task_state) { task_state->ShowClientTasks(client); }} inline void CancelAllTasks() { if (task_state) { task_state->CancelAllTasks(this); }} inline int GetActiveTaskCount() { return (task_state ? task_state->GetActiveTaskCount() : 0); } inline int GetActiveTaskID(int index) { return (task_state ? task_state->GetActiveTaskID(index) : -1); } diff --git a/zone/command.cpp b/zone/command.cpp index 9fb970f9b..dcda56ca8 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -10169,76 +10169,135 @@ void command_rules(Client *c, const Seperator *sep) { void command_task(Client *c, const Seperator *sep) { //super-command for managing tasks if(sep->arg[1][0] == '\0' || !strcasecmp(sep->arg[1], "help")) { - c->Message(Chat::White, "Syntax: #task [subcommand]."); - c->Message(Chat::White, "-- Task System Commands --"); - c->Message(Chat::White, "...show - List active tasks for a client"); - c->Message(Chat::White, "...update [Count]"); - c->Message(Chat::White, "...reloadall - Reload all Task information from the database"); - c->Message(Chat::White, "...reload task - Reload Task and Activity informnation for a single task"); - c->Message(Chat::White, "...reload lists - Reload goal/reward list information"); - c->Message(Chat::White, "...reload prox - Reload proximity information"); - c->Message(Chat::White, "...reload sets - Reload task set information"); + c->Message(Chat::White, "Syntax: #task [subcommand]"); + c->Message(Chat::White, "------------------------------------------------"); + c->Message(Chat::White, "# Task System Commands"); + c->Message(Chat::White, "------------------------------------------------"); + c->Message( + Chat::White, + fmt::format( + "--- [{}] List active tasks for a client", + EQ::SayLinkEngine::GenerateQuestSaylink("#task show", false, "show") + ).c_str() + ); + c->Message(Chat::White, "--- update [count] | Updates task"); + c->Message(Chat::White, "--- assign | Assigns task to client"); + c->Message( + Chat::White, + fmt::format( + "--- [{}] Reload all Task information from the database", + EQ::SayLinkEngine::GenerateQuestSaylink("#task reloadall", false, "reloadall") + ).c_str() + ); + c->Message( + Chat::White, + fmt::format( + "--- [{}] Reload Task and Activity informnation for a single task", + EQ::SayLinkEngine::GenerateQuestSaylink("#task reload task", false, "reload task") + ).c_str() + ); + c->Message( + Chat::White, + fmt::format( + "--- [{}] Reload goal/reward list information", + EQ::SayLinkEngine::GenerateQuestSaylink("#task reload lists", false, "reload lists") + ).c_str() + ); + c->Message( + Chat::White, + fmt::format( + "--- [{}] Reload proximity information", + EQ::SayLinkEngine::GenerateQuestSaylink("#task reload prox", false, "reload prox") + ).c_str() + ); + c->Message( + Chat::White, + fmt::format( + "--- [{}] Reload task set information", + EQ::SayLinkEngine::GenerateQuestSaylink("#task reload sets", false, "reload sets") + ).c_str() + ); return; } - if(!strcasecmp(sep->arg[1], "show")) { - if(c->GetTarget() && c->GetTarget()->IsClient()) - c->GetTarget()->CastToClient()->ShowClientTasks(); - else - c->ShowClientTasks(); + Client *client_target = c; + if (c->GetTarget() && c->GetTarget()->IsClient()) { + client_target = c->GetTarget()->CastToClient(); + } + if (!strcasecmp(sep->arg[1], "show")) { + c->ShowClientTasks(client_target); return; } - if(!strcasecmp(sep->arg[1], "update")) { - if(sep->argnum>=3) { - int TaskID = atoi(sep->arg[2]); - int ActivityID = atoi(sep->arg[3]); - int Count=1; + if (!strcasecmp(sep->arg[1], "update")) { + if (sep->argnum >= 3) { + int task_id = atoi(sep->arg[2]); + int activity_id = atoi(sep->arg[3]); + int count = 1; - if(sep->argnum>=4) { - Count = atoi(sep->arg[4]); - if(Count <= 0) - Count = 1; + if (sep->argnum >= 4) { + count = atoi(sep->arg[4]); + if (count <= 0) { + count = 1; + } } - c->Message(Chat::Yellow, "Updating Task %i, Activity %i, Count %i", TaskID, ActivityID, Count); - c->UpdateTaskActivity(TaskID, ActivityID, Count); + c->Message( + Chat::Yellow, + "Updating Task [%i] Activity [%i] Count [%i] for client [%s]", + task_id, + activity_id, + count, + client_target->GetCleanName() + ); + client_target->UpdateTaskActivity(task_id, activity_id, count); + c->ShowClientTasks(client_target); } return; } - if(!strcasecmp(sep->arg[1], "reloadall")) { + + if (!strcasecmp(sep->arg[1], "assign")) { + int task_id = atoi(sep->arg[2]); + if ((task_id > 0) && (task_id < MAXTASKS)) { + client_target->AssignTask(task_id, 0, false); + c->Message(Chat::Yellow, "Assigned task [%i] to [%s]", task_id, client_target->GetCleanName()); + } + return; + } + + if (!strcasecmp(sep->arg[1], "reloadall")) { c->Message(Chat::Yellow, "Sending reloadtasks to world"); worldserver.SendReloadTasks(RELOADTASKS); c->Message(Chat::Yellow, "Back again"); return; } - if(!strcasecmp(sep->arg[1], "reload")) { - if(sep->arg[2][0] != '\0') { - if(!strcasecmp(sep->arg[2], "lists")) { + if (!strcasecmp(sep->arg[1], "reload")) { + if (sep->arg[2][0] != '\0') { + if (!strcasecmp(sep->arg[2], "lists")) { c->Message(Chat::Yellow, "Sending reload lists to world"); worldserver.SendReloadTasks(RELOADTASKGOALLISTS); - c->Message(Chat::Yellow, "Back again"); + c->Message(Chat::Yellow, "Reloaded"); return; } - if(!strcasecmp(sep->arg[2], "prox")) { + if (!strcasecmp(sep->arg[2], "prox")) { c->Message(Chat::Yellow, "Sending reload proximities to world"); worldserver.SendReloadTasks(RELOADTASKPROXIMITIES); - c->Message(Chat::Yellow, "Back again"); + c->Message(Chat::Yellow, "Reloaded"); return; } - if(!strcasecmp(sep->arg[2], "sets")) { + if (!strcasecmp(sep->arg[2], "sets")) { c->Message(Chat::Yellow, "Sending reload task sets to world"); worldserver.SendReloadTasks(RELOADTASKSETS); - c->Message(Chat::Yellow, "Back again"); + c->Message(Chat::Yellow, "Reloaded"); return; } - if(!strcasecmp(sep->arg[2], "task") && (sep->arg[3][0] != '\0')) { - int TaskID = atoi(sep->arg[3]); - if((TaskID > 0) && (TaskID < MAXTASKS)) { - c->Message(Chat::Yellow, "Sending reload task %i to world", TaskID); - worldserver.SendReloadTasks(RELOADTASKS, TaskID); - c->Message(Chat::Yellow, "Back again"); + if (!strcasecmp(sep->arg[2], "task") && (sep->arg[3][0] != '\0')) { + int task_id = atoi(sep->arg[3]); + if ((task_id > 0) && (task_id < MAXTASKS)) { + c->Message(Chat::Yellow, "Sending reload task %i to world", task_id); + worldserver.SendReloadTasks(RELOADTASKS, task_id); + c->Message(Chat::Yellow, "Reloaded"); return; } } diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp index 64c52d64b..b235700a1 100644 --- a/zone/task_client_state.cpp +++ b/zone/task_client_state.cpp @@ -1052,7 +1052,6 @@ void ClientTaskState::IncrementDoneCount( Log(Logs::General, Logs::Tasks, "[UPDATE] IncrementDoneCount"); auto info = GetClientTaskInfo(task_information->type, task_index); - if (info == nullptr) { return; } @@ -1557,7 +1556,9 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit void ClientTaskState::ShowClientTasks(Client *client) { - client->Message(Chat::White, "Task Information:"); + client->Message(Chat::White, "------------------------------------------------"); + client->Message(Chat::White, "# Task Information | Client [%s]", client->GetCleanName()); +// client->Message(Chat::White, "------------------------------------------------"); if (active_task.task_id != TASKSLOTEMPTY) { client->Message( Chat::White, @@ -1586,27 +1587,51 @@ void ClientTaskState::ShowClientTasks(Client *client) continue; } + client->Message(Chat::White, "------------------------------------------------"); client->Message( - Chat::White, "Quest: %i %s", active_quest.task_id, + Chat::White, "# Quest | task_id [%i] title [%s]", + active_quest.task_id, p_task_manager->p_task_data[active_quest.task_id]->title.c_str() ); + client->Message(Chat::White, "------------------------------------------------"); client->Message( Chat::White, - " description: [%s]\n", + " -- Description [%s]\n", p_task_manager->p_task_data[active_quest.task_id]->description.c_str() ); for (int activity_id = 0; activity_id < p_task_manager->GetActivityCount(active_quest.task_id); activity_id++) { + std::vector update_increments = {"1", "5", "50"}; + std::string update_saylinks; + + for (auto &increment: update_increments) { + auto task_update_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format( + "#task update {} {} {}", + active_quest.task_id, + active_quest.activity[activity_id].activity_id, + increment + ), + false, + increment + ); + + update_saylinks += "[" + task_update_saylink + "] "; + } + client->Message( Chat::White, - " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", + " --- activity_id [%i] done_count [%i] state [%d] (0=hidden 1=active 2=complete) | Update %s", active_quest.activity[activity_id].activity_id, active_quest.activity[activity_id].done_count, - active_quest.activity[activity_id].activity_state + active_quest.activity[activity_id].activity_state, + update_saylinks.c_str() ); } } + + client->Message(Chat::White, "------------------------------------------------"); } // TODO: Shared Task diff --git a/zone/task_manager.cpp b/zone/task_manager.cpp index 96ab3ca82..87d56d6d2 100644 --- a/zone/task_manager.cpp +++ b/zone/task_manager.cpp @@ -1392,16 +1392,20 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s auto type = static_cast(character_task.type); if ((task_id < 0) || (task_id >= MAXTASKS)) { - LogTasks("[LoadClientState] Error: task_id [{}] out of range while loading character tasks from database", - task_id); + LogTasks( + "[LoadClientState] Error: task_id [{}] out of range while loading character tasks from database", + task_id + ); continue; } + // client data bucket pointer auto task_info = client_task_state->GetClientTaskInfo(type, slot); - if (task_info == nullptr) { - LogTasks("[LoadClientState] Error: slot [{}] out of range while loading character tasks from database", - slot); + LogTasks( + "[LoadClientState] Error: slot [{}] out of range while loading character tasks from database", + slot + ); continue; } From 8414973077d4d7b0b13e27b4de52c658f78c54ca Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sat, 6 Feb 2021 21:40:42 -0600 Subject: [PATCH 21/26] Typo [skip ci] --- zone/command.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zone/command.cpp b/zone/command.cpp index dcda56ca8..14e849256 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -10192,7 +10192,7 @@ void command_task(Client *c, const Seperator *sep) { c->Message( Chat::White, fmt::format( - "--- [{}] Reload Task and Activity informnation for a single task", + "--- [{}] Reload Task and Activity information for a single task", EQ::SayLinkEngine::GenerateQuestSaylink("#task reload task", false, "reload task") ).c_str() ); From 0c533071d41c806295b64869187468a9475d71b4 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sun, 7 Feb 2021 15:00:16 -0600 Subject: [PATCH 22/26] Yet more cleanup --- zone/bot_command.cpp | 2 +- zone/client.h | 12 +- zone/command.cpp | 2 +- zone/entity.cpp | 17 +- zone/entity.h | 2 +- zone/main.cpp | 31 +-- zone/questmgr.cpp | 28 +-- zone/task_client_state.cpp | 332 +++++++++++++-------------- zone/task_client_state.h | 25 ++- zone/task_manager.cpp | 450 ++++++++++++++++++------------------- zone/task_manager.h | 10 +- zone/tasks.cpp | 8 +- zone/worldserver.cpp | 16 +- zone/zone.cpp | 2 +- 14 files changed, 461 insertions(+), 476 deletions(-) diff --git a/zone/bot_command.cpp b/zone/bot_command.cpp index f7dbdd972..10b869d9c 100644 --- a/zone/bot_command.cpp +++ b/zone/bot_command.cpp @@ -76,7 +76,7 @@ extern QueryServ* QServ; extern WorldServer worldserver; -extern TaskManager *p_task_manager; +extern TaskManager *task_manager; void CatchSignal(int sig_num); diff --git a/zone/client.h b/zone/client.h index 931cb9fd4..160ea145b 100644 --- a/zone/client.h +++ b/zone/client.h @@ -88,7 +88,7 @@ namespace EQ #define XTARGET_HARDCAP 20 extern Zone* zone; -extern TaskManager *p_task_manager; +extern TaskManager *task_manager; class CLIENTPACKET { @@ -1039,7 +1039,7 @@ public: } inline bool SaveTaskState() { - return p_task_manager != nullptr && p_task_manager->SaveClientState(this, task_state); + return task_manager != nullptr && task_manager->SaveClientState(this, task_state); } inline bool IsTaskStateLoaded() { return task_state != nullptr; } inline bool IsTaskActive(int task_id) { return task_state != nullptr && task_state->IsTaskActive(task_id); } @@ -1137,8 +1137,8 @@ public: } inline void TaskSetSelector(Mob *mob, int task_set_id) { - if (p_task_manager) { - p_task_manager->TaskSetSelector( + if (task_manager) { + task_manager->TaskSetSelector( this, task_state, mob, @@ -1148,8 +1148,8 @@ public: } inline void TaskQuestSetSelector(Mob *mob, int count, int *tasks) { - if (p_task_manager) { - p_task_manager->TaskQuestSetSelector( + if (task_manager) { + task_manager->TaskQuestSetSelector( this, task_state, mob, diff --git a/zone/command.cpp b/zone/command.cpp index 14e849256..b88f1e102 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -77,7 +77,7 @@ extern QueryServ* QServ; extern WorldServer worldserver; -extern TaskManager *p_task_manager; +extern TaskManager *task_manager; extern FastMath g_Math; void CatchSignal(int sig_num); diff --git a/zone/entity.cpp b/zone/entity.cpp index 98c4dc2e5..dc630ceef 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -32,6 +32,7 @@ #include "../common/features.h" #include "../common/guilds.h" +#include "entity.h" #include "dynamiczone.h" #include "guild_mgr.h" #include "petitions.h" @@ -3900,22 +3901,24 @@ void EntityList::ProcessProximitySay(const char *Message, Client *c, uint8 langu void EntityList::SaveAllClientsTaskState() { - if (!p_task_manager) + if (!task_manager) { return; + } auto it = client_list.begin(); while (it != client_list.end()) { Client *client = it->second; - if (client->IsTaskStateLoaded()) + if (client->IsTaskStateLoaded()) { client->SaveTaskState(); + } ++it; } } -void EntityList::ReloadAllClientsTaskState(int TaskID) +void EntityList::ReloadAllClientsTaskState(int task_id) { - if (!p_task_manager) + if (!task_manager) return; auto it = client_list.begin(); @@ -3924,11 +3927,11 @@ void EntityList::ReloadAllClientsTaskState(int TaskID) if (client->IsTaskStateLoaded()) { // If we have been passed a TaskID, only reload the client state if they have // that Task active. - if ((!TaskID) || (TaskID && client->IsTaskActive(TaskID))) { + if ((!task_id) || (task_id && client->IsTaskActive(task_id))) { Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] Reloading Task State For Client %s", client->GetName()); client->RemoveClientTaskState(); client->LoadClientTaskState(); - p_task_manager->SendActiveTasksToClient(client); + task_manager->SendActiveTasksToClient(client); } } ++it; @@ -4136,7 +4139,7 @@ void EntityList::AddTempPetsToHateList(Mob *owner, Mob* other, bool bFrenzy) if (n->GetSwarmInfo()) { if (n->GetSwarmInfo()->owner_id == owner->GetID()) { if ( - !n->GetSpecialAbility(IMMUNE_AGGRO) && + !n->GetSpecialAbility(IMMUNE_AGGRO) && !(n->GetSpecialAbility(IMMUNE_AGGRO_CLIENT) && other->IsClient()) && !(n->GetSpecialAbility(IMMUNE_AGGRO_NPC) && other->IsNPC()) ) { diff --git a/zone/entity.h b/zone/entity.h index 5bb5981fa..5a93adf9d 100644 --- a/zone/entity.h +++ b/zone/entity.h @@ -483,7 +483,7 @@ public: void SendGroupLeader(uint32 gid, const char *lname, const char *oldlname); void SaveAllClientsTaskState(); - void ReloadAllClientsTaskState(int TaskID=0); + void ReloadAllClientsTaskState(int task_id=0); uint16 CreateGroundObject(uint32 itemid, const glm::vec4& position, uint32 decay_time = 300000); uint16 CreateGroundObjectFromModel(const char *model, const glm::vec4& position, uint8 type = 0x00, uint32 decay_time = 0); uint16 CreateDoor(const char *model, const glm::vec4& position, uint8 type = 0, uint16 size = 100); diff --git a/zone/main.cpp b/zone/main.cpp index 6cdd56735..376b8a508 100644 --- a/zone/main.cpp +++ b/zone/main.cpp @@ -22,26 +22,18 @@ #define PLATFORM_ZONE 1 #include "../common/global_define.h" -#include "../common/features.h" -#include "../common/queue.h" #include "../common/timer.h" #include "../common/eq_packet_structs.h" #include "../common/mutex.h" -#include "../common/version.h" -#include "../common/packet_dump_file.h" #include "../common/opcodemgr.h" #include "../common/guilds.h" #include "../common/eq_stream_ident.h" #include "../common/patches/patches.h" #include "../common/rulesys.h" #include "../common/profanity_manager.h" -#include "../common/misc_functions.h" #include "../common/string_util.h" -#include "../common/platform.h" #include "../common/crash.h" -#include "../common/ipc_mutex.h" #include "../common/memory_mapped_file.h" -#include "../common/eqemu_exception.h" #include "../common/spdat.h" #include "../common/eqemu_logsys.h" @@ -57,32 +49,21 @@ #endif #include "zonedb.h" #include "zone_store.h" -#include "zone_config.h" #include "titles.h" #include "guild_mgr.h" -#include "tasks.h" +#include "task_manager.h" #include "quest_parser_collection.h" #include "embparser.h" #include "lua_parser.h" #include "questmgr.h" #include "npc_scale_manager.h" -#include "../common/event/event_loop.h" -#include "../common/event/timer.h" #include "../common/net/eqstream.h" -#include "../common/net/servertalk_server.h" #include "../common/content/world_content_service.h" -#include "../common/repositories/content_flags_repository.h" -#include -#include -#include #include -#include #include #include -#include -#include #include #ifdef _CRTDBG_MAP_ALLOC @@ -115,8 +96,8 @@ char errorname[32]; extern Zone* zone; npcDecayTimes_Struct npcCorpseDecayTimes[100]; TitleManager title_manager; -QueryServ *QServ = 0; -TaskManager *p_task_manager = 0; +QueryServ *QServ = 0; +TaskManager *task_manager = 0; NpcScaleManager *npc_scale_manager; QuestParserCollection *parse = 0; EQEmuLogSys LogSys; @@ -426,8 +407,8 @@ int main(int argc, char** argv) { #endif if (RuleB(TaskSystem, EnableTaskSystem)) { - p_task_manager = new TaskManager; - p_task_manager->LoadTasks(); + task_manager = new TaskManager; + task_manager->LoadTasks(); } parse = new QuestParserCollection(); @@ -606,7 +587,7 @@ int main(int argc, char** argv) { if (zone != 0) Zone::Shutdown(true); //Fix for Linux world server problem. - safe_delete(p_task_manager); + safe_delete(task_manager); command_deinit(); #ifdef BOTS bot_command_deinit(); diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 247aa9501..a61a4e856 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -2223,27 +2223,27 @@ bool QuestManager::createBot(const char *name, const char *lastname, uint8 level void QuestManager::taskselector(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && p_task_manager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && task_manager) initiator->TaskQuestSetSelector(owner, taskcount, tasks); } void QuestManager::enabletask(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && p_task_manager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) initiator->EnableTask(taskcount, tasks); } void QuestManager::disabletask(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && p_task_manager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) initiator->DisableTask(taskcount, tasks); } bool QuestManager::istaskenabled(int taskid) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && p_task_manager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) return initiator->IsTaskEnabled(taskid); return false; @@ -2252,7 +2252,7 @@ bool QuestManager::istaskenabled(int taskid) { void QuestManager::tasksetselector(int tasksetid) { QuestManagerCurrentQuestVars(); Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSetSelector called for task set %i", tasksetid); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && p_task_manager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && task_manager) initiator->TaskSetSelector(owner, tasksetid); } @@ -2341,8 +2341,8 @@ int QuestManager::enabledtaskcount(int taskset) { int QuestManager::firsttaskinset(int taskset) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && p_task_manager) - return p_task_manager->FirstTaskInSet(taskset); + if(RuleB(TaskSystem, EnableTaskSystem) && task_manager) + return task_manager->FirstTaskInSet(taskset); return -1; } @@ -2350,8 +2350,8 @@ int QuestManager::firsttaskinset(int taskset) { int QuestManager::lasttaskinset(int taskset) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && p_task_manager) - return p_task_manager->LastTaskInSet(taskset); + if(RuleB(TaskSystem, EnableTaskSystem) && task_manager) + return task_manager->LastTaskInSet(taskset); return -1; } @@ -2359,8 +2359,8 @@ int QuestManager::lasttaskinset(int taskset) { int QuestManager::nexttaskinset(int taskset, int taskid) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && p_task_manager) - return p_task_manager->NextTaskInSet(taskset, taskid); + if(RuleB(TaskSystem, EnableTaskSystem) && task_manager) + return task_manager->NextTaskInSet(taskset, taskid); return -1; } @@ -2412,8 +2412,8 @@ int QuestManager::completedtasksinset(int taskset) { bool QuestManager::istaskappropriate(int task) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && p_task_manager) - return p_task_manager->ValidateLevel(task, initiator->GetLevel()); + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) + return task_manager->ValidateLevel(task, initiator->GetLevel()); return false; } @@ -2422,7 +2422,7 @@ std::string QuestManager::gettaskname(uint32 task_id) { QuestManagerCurrentQuestVars(); if (RuleB(TaskSystem, EnableTaskSystem)) { - return p_task_manager->GetTaskName(task_id); + return task_manager->GetTaskName(task_id); } return std::string(); diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp index b235700a1..0eaf8fc9b 100644 --- a/zone/task_client_state.cpp +++ b/zone/task_client_state.cpp @@ -14,17 +14,17 @@ extern QueryServ *QServ; ClientTaskState::ClientTaskState() { - active_task_count = 0; - last_completed_task_loaded = 0; - checked_touch_activities = false; + m_active_task_count = 0; + m_last_completed_task_loaded = 0; + m_checked_touch_activities = false; for (int i = 0; i < MAXACTIVEQUESTS; i++) { - active_quests[i].slot = i; - active_quests[i].task_id = TASKSLOTEMPTY; + m_active_quests[i].slot = i; + m_active_quests[i].task_id = TASKSLOTEMPTY; } - active_task.slot = 0; - active_task.task_id = TASKSLOTEMPTY; + m_active_task.slot = 0; + m_active_task.task_id = TASKSLOTEMPTY; // TODO: shared task } @@ -40,20 +40,20 @@ void ClientTaskState::SendTaskHistory(Client *client, int task_index) // We only sent the most recent 50 completed tasks, so we need to offset the Index the client sent to us. int adjusted_task_index = task_index; - if (completed_tasks.size() > 50) { - adjusted_task_index += (completed_tasks.size() - 50); + if (m_completed_tasks.size() > 50) { + adjusted_task_index += (m_completed_tasks.size() - 50); } - if ((adjusted_task_index < 0) || (adjusted_task_index >= (int) completed_tasks.size())) { + if ((adjusted_task_index < 0) || (adjusted_task_index >= (int) m_completed_tasks.size())) { return; } - int task_id = completed_tasks[adjusted_task_index].task_id; + int task_id = m_completed_tasks[adjusted_task_index].task_id; if ((task_id < 0) || (task_id > MAXTASKS)) { return; } - TaskInformation *p_task_data = p_task_manager->p_task_data[task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[task_id]; if (p_task_data == nullptr) { return; @@ -69,7 +69,7 @@ void ClientTaskState::SendTaskHistory(Client *client, int task_index) int packet_length = sizeof(TaskHistoryReplyHeader_Struct); for (int i = 0; i < p_task_data->activity_count; i++) { - if (completed_tasks[adjusted_task_index].activity_done[i]) { + if (m_completed_tasks[adjusted_task_index].activity_done[i]) { completed_activity_count++; packet_length = packet_length + sizeof(TaskHistoryReplyData1_Struct) + p_task_data->activity_information[i].target_name.size() + 1 + @@ -90,7 +90,7 @@ void ClientTaskState::SendTaskHistory(Client *client, int task_index) reply = (char *) task_history_reply + sizeof(TaskHistoryReplyHeader_Struct); for (int i = 0; i < p_task_data->activity_count; i++) { - if (completed_tasks[adjusted_task_index].activity_done[i]) { + if (m_completed_tasks[adjusted_task_index].activity_done[i]) { task_history_reply_data_1 = (TaskHistoryReplyData1_Struct *) reply; task_history_reply_data_1->ActivityType = p_task_data->activity_information[i].activity_type; reply = (char *) task_history_reply_data_1 + sizeof(TaskHistoryReplyData1_Struct); @@ -118,10 +118,10 @@ void ClientTaskState::EnableTask(int character_id, int task_count, int *task_lis std::vector tasks_enabled; for (int i = 0; i < task_count; i++) { - auto iterator = enabled_tasks.begin(); + auto iterator = m_enabled_tasks.begin(); bool add_task = true; - while (iterator != enabled_tasks.end()) { + while (iterator != m_enabled_tasks.end()) { // If this task is already enabled, stop looking if ((*iterator) == task_list[i]) { add_task = false; @@ -136,14 +136,14 @@ void ClientTaskState::EnableTask(int character_id, int task_count, int *task_lis } if (add_task) { - enabled_tasks.insert(iterator, task_list[i]); + m_enabled_tasks.insert(iterator, task_list[i]); // Make a note of the task we enabled, for later SQL generation tasks_enabled.push_back(task_list[i]); } } LogTasksDetail("[EnableTask] New enabled task list"); - for (int enabled_task : enabled_tasks) { + for (int enabled_task : m_enabled_tasks) { LogTasksDetail("[EnableTask] enabled [{}] character_id [{}]", enabled_task, character_id); } @@ -173,10 +173,10 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li std::vector tasks_disabled; for (int task_id = 0; task_id < task_count; task_id++) { - auto iterator = enabled_tasks.begin(); + auto iterator = m_enabled_tasks.begin(); bool removeTask = false; - while (iterator != enabled_tasks.end()) { + while (iterator != m_enabled_tasks.end()) { if ((*iterator) == task_list[task_id]) { removeTask = true; break; @@ -190,13 +190,13 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li } if (removeTask) { - enabled_tasks.erase(iterator); + m_enabled_tasks.erase(iterator); tasks_disabled.push_back(task_list[task_id]); } } LogTasks("[DisableTask] New enabled task list "); - for (int enabled_task : enabled_tasks) { + for (int enabled_task : m_enabled_tasks) { LogTasks("[DisableTask] enabled_tasks [{}]", enabled_task); } @@ -233,9 +233,9 @@ bool ClientTaskState::IsTaskEnabled(int task_id) { std::vector::iterator iterator; - iterator = enabled_tasks.begin(); + iterator = m_enabled_tasks.begin(); - while (iterator != enabled_tasks.end()) { + while (iterator != m_enabled_tasks.end()) { if ((*iterator) == task_id) { return true; } if ((*iterator) > task_id) { break; } ++iterator; @@ -255,17 +255,17 @@ int ClientTaskState::EnabledTaskCount(int task_set_id) if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } - while ((enabled_task_index < enabled_tasks.size()) && - (task_set_index < p_task_manager->task_sets[task_set_id].size())) { + while ((enabled_task_index < m_enabled_tasks.size()) && + (task_set_index < task_manager->m_task_sets[task_set_id].size())) { - if (enabled_tasks[enabled_task_index] == p_task_manager->task_sets[task_set_id][task_set_index]) { + if (m_enabled_tasks[enabled_task_index] == task_manager->m_task_sets[task_set_id][task_set_index]) { enabled_task_count++; enabled_task_index++; task_set_index++; continue; } - if (enabled_tasks[enabled_task_index] < p_task_manager->task_sets[task_set_id][task_set_index]) { + if (m_enabled_tasks[enabled_task_index] < task_manager->m_task_sets[task_set_id][task_set_index]) { enabled_task_index++; } else { @@ -285,7 +285,7 @@ int ClientTaskState::ActiveTasksInSet(int task_set_id) int active_task_in_set_count = 0; - for (int task_id : p_task_manager->task_sets[task_set_id]) { + for (int task_id : task_manager->m_task_sets[task_set_id]) { if (IsTaskActive(task_id)) { active_task_in_set_count++; } @@ -302,7 +302,7 @@ int ClientTaskState::CompletedTasksInSet(int task_set_id) int completed_tasks_count = 0; - for (int i : p_task_manager->task_sets[task_set_id]) { + for (int i : task_manager->m_task_sets[task_set_id]) { if (IsTaskCompleted(i)) { completed_tasks_count++; } @@ -319,11 +319,11 @@ bool ClientTaskState::HasSlotForTask(TaskInformation *task) switch (task->type) { case TaskType::Task: - return active_task.task_id == TASKSLOTEMPTY; + return m_active_task.task_id == TASKSLOTEMPTY; case TaskType::Shared: return false; // todo case TaskType::Quest: - for (auto &active_quest : active_quests) { + for (auto &active_quest : m_active_quests) { if (active_quest.task_id == TASKSLOTEMPTY) { return true; } @@ -342,7 +342,7 @@ int ClientTaskState::GetActiveTaskID(int index) return 0; } - return active_quests[index].task_id; + return m_active_quests[index].task_id; } static void DeleteCompletedTaskFromDatabase(int character_id, int task_id) @@ -359,7 +359,7 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & { bool all_activities_complete = true; - TaskInformation *p_task_information = p_task_manager->p_task_data[task_info.task_id]; + TaskInformation *p_task_information = task_manager->m_task_data[task_info.task_id]; if (p_task_information == nullptr) { return true; } @@ -397,12 +397,12 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & if (all_activities_complete && RuleB(TaskSystem, RecordCompletedTasks)) { if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { LogTasks("KeepOneRecord enabled"); - auto iterator = completed_tasks.begin(); + auto iterator = m_completed_tasks.begin(); int erased_elements = 0; - while (iterator != completed_tasks.end()) { + while (iterator != m_completed_tasks.end()) { int task_id = (*iterator).task_id; if (task_id == task_info.task_id) { - iterator = completed_tasks.erase(iterator); + iterator = m_completed_tasks.erase(iterator); erased_elements++; } else { @@ -413,7 +413,7 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & LogTasks("Erased Element count is [{}]", erased_elements); if (erased_elements) { - last_completed_task_loaded -= erased_elements; + m_last_completed_task_loaded -= erased_elements; DeleteCompletedTaskFromDatabase(character_id, task_info.task_id); } } @@ -427,7 +427,7 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & ActivityCompleted); } - completed_tasks.push_back(completed_task_information); + m_completed_tasks.push_back(completed_task_information); } LogTasks("Returning sequential task, AllActivitiesComplete is [{}]", all_activities_complete); @@ -484,13 +484,13 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & // the same task again, erase the previous completed entry for this task. if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { LogTasksDetail("[UnlockActivities] KeepOneRecord enabled"); - auto iterator = completed_tasks.begin(); + auto iterator = m_completed_tasks.begin(); int erased_elements = 0; - while (iterator != completed_tasks.end()) { + while (iterator != m_completed_tasks.end()) { int task_id = (*iterator).task_id; if (task_id == task_info.task_id) { - iterator = completed_tasks.erase(iterator); + iterator = m_completed_tasks.erase(iterator); erased_elements++; } else { @@ -501,7 +501,7 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & LogTasksDetail("[UnlockActivities] Erased Element count is [{}]", erased_elements); if (erased_elements) { - last_completed_task_loaded -= erased_elements; + m_last_completed_task_loaded -= erased_elements; DeleteCompletedTaskFromDatabase(character_id, task_info.task_id); } } @@ -515,7 +515,7 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & (task_info.activity[activity_id].activity_state == ActivityCompleted); } - completed_tasks.push_back(completed_task_information); + m_completed_tasks.push_back(completed_task_information); } return true; } @@ -548,19 +548,19 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np int is_updating = false; // If the client has no tasks, there is nothing further to check. - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return false; } // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { + for (auto &active_task : m_active_tasks) { auto current_task = &active_task; if (current_task->task_id == TASKSLOTEMPTY) { continue; } // Check if there are any active kill activities for this p_task_information - auto p_task_data = p_task_manager->p_task_data[current_task->task_id]; + auto p_task_data = task_manager->m_task_data[current_task->task_id]; if (p_task_data == nullptr) { return false; } @@ -598,7 +598,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np break; case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList( + if (!task_manager->m_goal_list_manager.IsInList( activity_info->goal_id, npc_type_id )) { @@ -625,18 +625,18 @@ int ClientTaskState::ActiveSpeakTask(int npc_type_id) // This method is to be used from Perl quests only and returns the task_id of the first // active task found which has an active SpeakWith activity_information for this NPC. - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return 0; } // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { + for (auto &active_task : m_active_tasks) { auto current_task = &active_task; if (current_task->task_id == TASKSLOTEMPTY) { continue; } - TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[current_task->task_id]; if (p_task_data == nullptr) { continue; } @@ -671,7 +671,7 @@ int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) // This method is to be used from Perl quests only and returns the activity_id of the first // active activity_information found in the specified task which is to SpeakWith this NPC. - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return -1; } if (task_id <= 0 || task_id >= MAXTASKS) { @@ -679,13 +679,13 @@ int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) } // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { + for (auto &active_task : m_active_tasks) { auto current_task = &active_task; if (current_task->task_id != task_id) { continue; } - TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[current_task->task_id]; if (p_task_data == nullptr) { continue; } @@ -732,12 +732,12 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t item_id ); - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; } // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { + for (auto &active_task : m_active_tasks) { auto current_task = &active_task; if (current_task->task_id == TASKSLOTEMPTY) { continue; @@ -745,7 +745,7 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t // Check if there are any active loot activities for this task - TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[current_task->task_id]; if (p_task_data == nullptr) { return; } @@ -781,7 +781,7 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t break; case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList( + if (!task_manager->m_goal_list_manager.IsInList( activity_info->goal_id, item_id )) { continue; } @@ -801,12 +801,12 @@ void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_t void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) { LogTasks("[UpdateTasksOnExplore] explore_id [{}]", explore_id); - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; } // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { + for (auto &active_task : m_active_tasks) { auto current_task = &active_task; if (current_task->task_id == TASKSLOTEMPTY) { continue; @@ -814,7 +814,7 @@ void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) // Check if there are any active explore activities for this task - TaskInformation *task_data = p_task_manager->p_task_data[current_task->task_id]; + TaskInformation *task_data = task_manager->m_task_data[current_task->task_id]; if (task_data == nullptr) { return; } @@ -849,7 +849,7 @@ void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) break; case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList( + if (!task_manager->m_goal_list_manager.IsInList( activity_info->goal_id, explore_id )) { @@ -891,19 +891,19 @@ bool ClientTaskState::UpdateTasksOnDeliver( bool is_updated = false; LogTasks("[UpdateTasksOnDeliver] [{}]", npc_type_id); - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return false; } // loop over the union of tasks and quests for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto current_task = &active_tasks[i]; + auto current_task = &m_active_tasks[i]; if (current_task->task_id == TASKSLOTEMPTY) { continue; } // Check if there are any active deliver activities for this task - TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[current_task->task_id]; if (p_task_data == nullptr) { return false; } @@ -952,7 +952,7 @@ bool ClientTaskState::UpdateTasksOnDeliver( break; case METHODLIST: - if (!p_task_manager->goal_list_manager.IsInList( + if (!task_manager->m_goal_list_manager.IsInList( activity_info->goal_id, item->GetID())) { continue; @@ -986,19 +986,19 @@ void ClientTaskState::UpdateTasksOnTouch(Client *client, int zone_id) // If the client has no tasks, there is nothing further to check. LogTasks("[UpdateTasksOnTouch] [{}] ", zone_id); - if (!p_task_manager || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... return; } // loop over the union of tasks and quests - for (auto &active_task : active_tasks) { + for (auto &active_task : m_active_tasks) { auto current_task = &active_task; if (current_task->task_id == TASKSLOTEMPTY) { continue; } // Check if there are any active explore activities for this task - TaskInformation *p_task_data = p_task_manager->p_task_data[current_task->task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[current_task->task_id]; if (p_task_data == nullptr) { return; } @@ -1094,7 +1094,7 @@ void ClientTaskState::IncrementDoneCount( // and by the 'Task Stage Completed' message client->SendTaskActivityComplete(info->task_id, activity_id, task_index, task_information->type); // Send the updated task/activity_information list to the client - p_task_manager->SendSingleActiveTaskToClient(client, *info, task_complete, false); + task_manager->SendSingleActiveTaskToClient(client, *info, task_complete, false); // Inform the client the task has been updated, both by a chat message client->Message(Chat::White, "Your task '%s' has been updated.", task_information->title.c_str()); @@ -1146,9 +1146,9 @@ void ClientTaskState::IncrementDoneCount( QServ->PlayerLogEvent(Player_Log_Task_Updates, client->CharacterID(), event_desc); } - p_task_manager->SendCompletedTasksToClient(client, this); + task_manager->SendCompletedTasksToClient(client, this); client->SendTaskActivityComplete(info->task_id, 0, task_index, task_information->type, 0); - p_task_manager->SaveClientState(client, this); + task_manager->SaveClientState(client, this); //c->SendTaskComplete(TaskIndex); client->CancelTask(task_index, task_information->type); //if(Task->reward_method != METHODQUEST) RewardTask(c, Task); @@ -1161,11 +1161,11 @@ void ClientTaskState::IncrementDoneCount( } else { // Send an updated packet for this single activity_information - p_task_manager->SendTaskActivityLong( + task_manager->SendTaskActivityLong( client, info->task_id, activity_id, task_index, task_information->activity_information[activity_id].optional ); - p_task_manager->SaveClientState(client, this); + task_manager->SaveClientState(client, this); } } @@ -1191,7 +1191,7 @@ void ClientTaskState::RewardTask(Client *client, TaskInformation *task_informati break; } case METHODLIST: { - reward_list = p_task_manager->goal_list_manager.GetListContents(task_information->reward_id); + reward_list = task_manager->m_goal_list_manager.GetListContents(task_information->reward_id); for (int item_id : reward_list) { client->SummonItem(item_id); item_data = database.GetItem(item_id); @@ -1297,15 +1297,15 @@ void ClientTaskState::RewardTask(Client *client, TaskInformation *task_informati bool ClientTaskState::IsTaskActive(int task_id) { - if (active_task.task_id == task_id) { + if (m_active_task.task_id == task_id) { return true; } - if (active_task_count == 0 || task_id == 0) { + if (m_active_task_count == 0 || task_id == 0) { return false; } - for (auto &active_quest : active_quests) { + for (auto &active_quest : m_active_quests) { if (active_quest.task_id == task_id) { return true; } @@ -1320,10 +1320,10 @@ void ClientTaskState::FailTask(Client *client, int task_id) "[FailTask] Failing task for character [{}] task_id [{}] task_count [{}]", client->GetCleanName(), task_id, - active_task_count + m_active_task_count ); - if (active_task.task_id == task_id) { + if (m_active_task.task_id == task_id) { client->SendTaskFailed(task_id, 0, TaskType::Task); // Remove the task from the client client->CancelTask(0, TaskType::Task); @@ -1332,13 +1332,13 @@ void ClientTaskState::FailTask(Client *client, int task_id) // TODO: shared tasks - if (active_task_count == 0) { + if (m_active_task_count == 0) { return; } for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { - client->SendTaskFailed(active_quests[i].task_id, i, TaskType::Quest); + if (m_active_quests[i].task_id == task_id) { + client->SendTaskFailed(m_active_quests[i].task_id, i, TaskType::Quest); // Remove the task from the client client->CancelTask(i, TaskType::Quest); return; @@ -1355,20 +1355,20 @@ bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) if (activity_id < 0) { return false; } - if (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY) { + if (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY) { return false; } int active_task_index = -1; auto task_type = TaskType::Task; - if (active_task.task_id == task_id) { + if (m_active_task.task_id == task_id) { active_task_index = 0; } if (active_task_index == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { + if (m_active_quests[i].task_id == task_id) { active_task_index = i; task_type = TaskType::Quest; break; @@ -1387,7 +1387,7 @@ bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) return false; } - TaskInformation *p_task_data = p_task_manager->p_task_data[info->task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[info->task_id]; // The task is invalid if (p_task_data == nullptr) { @@ -1424,20 +1424,20 @@ void ClientTaskState::UpdateTaskActivity( ); // Quick sanity check - if (activity_id < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { + if (activity_id < 0 || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { return; } int active_task_index = -1; auto type = TaskType::Task; - if (active_task.task_id == task_id) { + if (m_active_task.task_id == task_id) { active_task_index = 0; } if (active_task_index == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { + if (m_active_quests[i].task_id == task_id) { active_task_index = i; type = TaskType::Quest; break; @@ -1455,7 +1455,7 @@ void ClientTaskState::UpdateTaskActivity( return; } - TaskInformation *p_task_data = p_task_manager->p_task_data[info->task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[info->task_id]; // The task is invalid if (p_task_data == nullptr) { @@ -1492,19 +1492,19 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit ); // Quick sanity check - if (activity_id < 0 || (active_task_count == 0 && active_task.task_id == TASKSLOTEMPTY)) { + if (activity_id < 0 || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { return; } int active_task_index = -1; auto type = TaskType::Task; - if (active_task.task_id == task_id) { + if (m_active_task.task_id == task_id) { active_task_index = 0; } if (active_task_index == -1) { for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (active_quests[i].task_id == task_id) { + if (m_active_quests[i].task_id == task_id) { active_task_index = i; type = TaskType::Quest; break; @@ -1522,7 +1522,7 @@ void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activit return; } - TaskInformation *p_task_data = p_task_manager->p_task_data[info->task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[info->task_id]; if (p_task_data == nullptr) { return; } @@ -1559,30 +1559,30 @@ void ClientTaskState::ShowClientTasks(Client *client) client->Message(Chat::White, "------------------------------------------------"); client->Message(Chat::White, "# Task Information | Client [%s]", client->GetCleanName()); // client->Message(Chat::White, "------------------------------------------------"); - if (active_task.task_id != TASKSLOTEMPTY) { + if (m_active_task.task_id != TASKSLOTEMPTY) { client->Message( Chat::White, "Task: %i %s", - active_task.task_id, - p_task_manager->p_task_data[active_task.task_id]->title.c_str() + m_active_task.task_id, + task_manager->m_task_data[m_active_task.task_id]->title.c_str() ); client->Message( Chat::White, " description: [%s]\n", - p_task_manager->p_task_data[active_task.task_id]->description.c_str() + task_manager->m_task_data[m_active_task.task_id]->description.c_str() ); - for (int activity_id = 0; activity_id < p_task_manager->GetActivityCount(active_task.task_id); activity_id++) { + for (int activity_id = 0; activity_id < task_manager->GetActivityCount(m_active_task.task_id); activity_id++) { client->Message( Chat::White, " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - active_task.activity[activity_id].activity_id, - active_task.activity[activity_id].done_count, - active_task.activity[activity_id].activity_state + m_active_task.activity[activity_id].activity_id, + m_active_task.activity[activity_id].done_count, + m_active_task.activity[activity_id].activity_state ); } } - for (auto &active_quest : active_quests) { + for (auto &active_quest : m_active_quests) { if (active_quest.task_id == TASKSLOTEMPTY) { continue; } @@ -1591,17 +1591,17 @@ void ClientTaskState::ShowClientTasks(Client *client) client->Message( Chat::White, "# Quest | task_id [%i] title [%s]", active_quest.task_id, - p_task_manager->p_task_data[active_quest.task_id]->title.c_str() + task_manager->m_task_data[active_quest.task_id]->title.c_str() ); client->Message(Chat::White, "------------------------------------------------"); client->Message( Chat::White, " -- Description [%s]\n", - p_task_manager->p_task_data[active_quest.task_id]->description.c_str() + task_manager->m_task_data[active_quest.task_id]->description.c_str() ); - for (int activity_id = 0; activity_id < p_task_manager->GetActivityCount(active_quest.task_id); activity_id++) { + for (int activity_id = 0; activity_id < task_manager->GetActivityCount(active_quest.task_id); activity_id++) { std::vector update_increments = {"1", "5", "50"}; std::string update_saylinks; @@ -1637,10 +1637,10 @@ void ClientTaskState::ShowClientTasks(Client *client) // TODO: Shared Task int ClientTaskState::TaskTimeLeft(int task_id) { - if (active_task.task_id == task_id) { + if (m_active_task.task_id == task_id) { int time_now = time(nullptr); - TaskInformation *p_task_data = p_task_manager->p_task_data[task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[task_id]; if (p_task_data == nullptr) { return -1; } @@ -1649,23 +1649,23 @@ int ClientTaskState::TaskTimeLeft(int task_id) return -1; } - int time_left = (active_task.accepted_time + p_task_data->duration - time_now); + int time_left = (m_active_task.accepted_time + p_task_data->duration - time_now); return (time_left > 0 ? time_left : 0); } - if (active_task_count == 0) { + if (m_active_task_count == 0) { return -1; } - for (auto &active_quest : active_quests) { + for (auto &active_quest : m_active_quests) { if (active_quest.task_id != task_id) { continue; } int time_now = time(nullptr); - TaskInformation *p_task_data = p_task_manager->p_task_data[active_quest.task_id]; + TaskInformation *p_task_data = task_manager->m_task_data[active_quest.task_id]; if (p_task_data == nullptr) { return -1; } @@ -1695,7 +1695,7 @@ int ClientTaskState::IsTaskCompleted(int task_id) return -1; } - for (auto &completed_task : completed_tasks) { + for (auto &completed_task : m_completed_tasks) { LogTasks("[IsTaskCompleted] Comparing compelted task [{}] with [{}]", completed_task.task_id, task_id); if (completed_task.task_id == task_id) { return 1; @@ -1719,7 +1719,7 @@ bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) } int time_now = time(nullptr); - TaskInformation *task_data = p_task_manager->p_task_data[info->task_id]; + TaskInformation *task_data = task_manager->m_task_data[info->task_id]; if (task_data == nullptr) { return false; } @@ -1729,10 +1729,10 @@ bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) void ClientTaskState::TaskPeriodicChecks(Client *client) { - if (active_task.task_id != TASKSLOTEMPTY) { + if (m_active_task.task_id != TASKSLOTEMPTY) { if (TaskOutOfTime(TaskType::Task, 0)) { // Send Red Task Failed Message - client->SendTaskFailed(active_task.task_id, 0, TaskType::Task); + client->SendTaskFailed(m_active_task.task_id, 0, TaskType::Task); // Remove the task from the client client->CancelTask(0, TaskType::Task); // It is a conscious decision to only fail one task per call to this method, @@ -1744,20 +1744,20 @@ void ClientTaskState::TaskPeriodicChecks(Client *client) // TODO: shared tasks -- although that will probably be manager in world checking and telling zones to fail us - if (active_task_count == 0) { + if (m_active_task_count == 0) { return; } // Check for tasks that have failed because they have not been completed in the specified time // for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) { - if (active_quests[task_index].task_id == TASKSLOTEMPTY) { + if (m_active_quests[task_index].task_id == TASKSLOTEMPTY) { continue; } if (TaskOutOfTime(TaskType::Quest, task_index)) { // Send Red Task Failed Message - client->SendTaskFailed(active_quests[task_index].task_id, task_index, TaskType::Quest); + client->SendTaskFailed(m_active_quests[task_index].task_id, task_index, TaskType::Quest); // Remove the task from the client client->CancelTask(task_index, TaskType::Quest); // It is a conscious decision to only fail one task per call to this method, @@ -1771,9 +1771,9 @@ void ClientTaskState::TaskPeriodicChecks(Client *client) // This is done in this method because it gives an extra few seconds for the client screen to display // the zone before we send the 'Task activity_information Completed' message. // - if (!checked_touch_activities) { + if (!m_checked_touch_activities) { UpdateTasksOnTouch(client, zone->GetZoneID()); - checked_touch_activities = true; + m_checked_touch_activities = true; } } @@ -1784,12 +1784,12 @@ bool ClientTaskState::IsTaskActivityCompleted(TaskType task_type, int index, int if (index != 0) { return false; } - return active_task.activity[activity_id].activity_state == ActivityCompleted; + return m_active_task.activity[activity_id].activity_state == ActivityCompleted; case TaskType::Shared: return false; // TODO: shared tasks case TaskType::Quest: if (index < MAXACTIVEQUESTS) { - return active_quests[index].activity[activity_id].activity_state == ActivityCompleted; + return m_active_quests[index].activity[activity_id].activity_state == ActivityCompleted; } default: return false; @@ -1805,12 +1805,12 @@ ActivityState ClientTaskState::GetTaskActivityState(TaskType task_type, int inde if (index != 0) { return ActivityHidden; } - return active_task.activity[activity_id].activity_state; + return m_active_task.activity[activity_id].activity_state; case TaskType::Shared: return ActivityHidden; // TODO: shared tasks case TaskType::Quest: if (index < MAXACTIVEQUESTS) { - return active_quests[index].activity[activity_id].activity_state; + return m_active_quests[index].activity[activity_id].activity_state; } default: return ActivityHidden; @@ -1824,12 +1824,12 @@ int ClientTaskState::GetTaskActivityDoneCount(TaskType task_type, int index, int if (index != 0) { return 0; } - return active_task.activity[activity_id].done_count; + return m_active_task.activity[activity_id].done_count; case TaskType::Shared: return 0; // TODO: shared tasks case TaskType::Quest: if (index < MAXACTIVEQUESTS) { - return active_quests[index].activity[activity_id].done_count; + return m_active_quests[index].activity[activity_id].done_count; } default: return 0; @@ -1838,8 +1838,8 @@ int ClientTaskState::GetTaskActivityDoneCount(TaskType task_type, int index, int int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id) { - if (active_task.task_id == task_id) { - return active_task.activity[activity_id].done_count; + if (m_active_task.task_id == task_id) { + return m_active_task.activity[activity_id].done_count; } // TODO: shared tasks @@ -1847,7 +1847,7 @@ int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int task_id, int activit int active_task_index = -1; for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) { - if (active_quests[task_index].task_id == task_id) { + if (m_active_quests[task_index].task_id == task_id) { active_task_index = task_index; break; } @@ -1857,8 +1857,8 @@ int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int task_id, int activit return 0; } - if (active_quests[active_task_index].activity[activity_id].done_count) { - return active_quests[active_task_index].activity[activity_id].done_count; + if (m_active_quests[active_task_index].activity[activity_id].done_count) { + return m_active_quests[active_task_index].activity[activity_id].done_count; } else { return 0; @@ -1869,9 +1869,9 @@ int ClientTaskState::GetTaskStartTime(TaskType task_type, int index) { switch (task_type) { case TaskType::Task: - return active_task.accepted_time; + return m_active_task.accepted_time; case TaskType::Quest: - return active_quests[index].accepted_time; + return m_active_quests[index].accepted_time; case TaskType::Shared: // TODO default: return -1; @@ -1886,12 +1886,12 @@ void ClientTaskState::CancelAllTasks(Client *client) // resent to the client, in case an updated task fails to load CancelTask(client, 0, TaskType::Task, false); - active_task.task_id = TASKSLOTEMPTY; + m_active_task.task_id = TASKSLOTEMPTY; for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) - if (active_quests[task_index].task_id != TASKSLOTEMPTY) { + if (m_active_quests[task_index].task_id != TASKSLOTEMPTY) { CancelTask(client, task_index, TaskType::Quest, false); - active_quests[task_index].task_id = TASKSLOTEMPTY; + m_active_quests[task_index].task_id = TASKSLOTEMPTY; } // TODO: shared @@ -1924,12 +1924,12 @@ void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType t switch (task_type) { case TaskType::Task: if (sequence_number == 0) { - task_id = active_task.task_id; + task_id = m_active_task.task_id; } break; case TaskType::Quest: if (sequence_number < MAXACTIVEQUESTS) { - task_id = active_quests[sequence_number].task_id; + task_id = m_active_quests[sequence_number].task_id; } break; case TaskType::Shared: // TODO: @@ -1949,13 +1949,13 @@ void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType t switch (task_type) { case TaskType::Task: - active_task.task_id = TASKSLOTEMPTY; + m_active_task.task_id = TASKSLOTEMPTY; break; case TaskType::Shared: break; // TODO: shared tasks case TaskType::Quest: - active_quests[sequence_number].task_id = TASKSLOTEMPTY; - active_task_count--; + m_active_quests[sequence_number].task_id = TASKSLOTEMPTY; + m_active_task_count--; break; default: break; @@ -1964,7 +1964,7 @@ void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType t void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) { - auto task_type = p_task_manager->GetTaskType(task_id); + auto task_type = task_manager->GetTaskType(task_id); int character_id = client->CharacterID(); CharacterActivitiesRepository::DeleteWhere( @@ -1979,7 +1979,7 @@ void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) switch (task_type) { case TaskType::Task: { - if (active_task.task_id == task_id) { + 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 = 0; @@ -1987,7 +1987,7 @@ void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) LogTasks("[UPDATE] RemoveTaskByTaskID found Task [{}]", task_id); client->QueuePacket(outapp); safe_delete(outapp); - active_task.task_id = TASKSLOTEMPTY; + m_active_task.task_id = TASKSLOTEMPTY; } break; } @@ -1996,14 +1996,14 @@ void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) } case TaskType::Quest: { for (int active_quest = 0; active_quest < MAXACTIVEQUESTS; active_quest++) { - if (active_quests[active_quest].task_id == task_id) { + 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); LogTasks("[UPDATE] RemoveTaskByTaskID found Quest [{}] at index [{}]", task_id, active_quest); - active_quests[active_quest].task_id = TASKSLOTEMPTY; - active_task_count--; + m_active_quests[active_quest].task_id = TASKSLOTEMPTY; + m_active_task_count--; client->QueuePacket(outapp); safe_delete(outapp); } @@ -2017,12 +2017,12 @@ void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id, bool enforce_level_requirement) { - if (!p_task_manager || task_id < 0 || task_id >= MAXTASKS) { + if (!task_manager || task_id < 0 || task_id >= MAXTASKS) { client->Message(Chat::Red, "Task system not functioning, or task_id %i out of range.", task_id); return; } - auto task = p_task_manager->p_task_data[task_id]; + auto task = task_manager->m_task_data[task_id]; if (task == nullptr) { client->Message(Chat::Red, "Invalid task_id %i", task_id); @@ -2033,7 +2033,7 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id switch (task->type) { case TaskType::Task: - if (active_task.task_id != TASKSLOTEMPTY) { + if (m_active_task.task_id != TASKSLOTEMPTY) { max_tasks = true; } break; @@ -2042,7 +2042,7 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id max_tasks = true; break; case TaskType::Quest: - if (active_task_count == MAXACTIVEQUESTS) { + if (m_active_task_count == MAXACTIVEQUESTS) { max_tasks = true; } break; @@ -2061,7 +2061,7 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id // only Quests can have more than one, so don't need to check others if (task->type == TaskType::Quest) { - for (auto &active_quest : active_quests) { + for (auto &active_quest : m_active_quests) { if (active_quest.task_id == task_id) { client->Message(Chat::Red, "You have already been assigned this task."); return; @@ -2069,12 +2069,12 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id } } - if (enforce_level_requirement && !p_task_manager->ValidateLevel(task_id, client->GetLevel())) { + if (enforce_level_requirement && !task_manager->ValidateLevel(task_id, client->GetLevel())) { client->Message(Chat::Red, "You are outside the level range of this task."); return; } - if (!p_task_manager->IsTaskRepeatable(task_id) && IsTaskCompleted(task_id)) { + if (!task_manager->IsTaskRepeatable(task_id) && IsTaskCompleted(task_id)) { return; } @@ -2086,7 +2086,7 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id ClientTaskInformation *active_slot = nullptr; switch (task->type) { case TaskType::Task: - active_slot = &active_task; + active_slot = &m_active_task; break; case TaskType::Shared: // TODO: shared active_slot = nullptr; @@ -2095,9 +2095,9 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) { Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState Looking for free slot in slot %i, found task_id of %i", task_index, - active_quests[task_index].task_id); - if (active_quests[task_index].task_id == 0) { - active_slot = &active_quests[task_index]; + m_active_quests[task_index].task_id); + if (m_active_quests[task_index].task_id == 0) { + active_slot = &m_active_quests[task_index]; break; } } @@ -2121,7 +2121,7 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id active_slot->updated = true; active_slot->current_step = -1; - for (int activity_id = 0; activity_id < p_task_manager->p_task_data[task_id]->activity_count; activity_id++) { + for (int activity_id = 0; activity_id < task_manager->m_task_data[task_id]->activity_count; activity_id++) { active_slot->activity[activity_id].activity_id = activity_id; active_slot->activity[activity_id].done_count = 0; active_slot->activity[activity_id].activity_state = ActivityHidden; @@ -2131,16 +2131,16 @@ void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id UnlockActivities(client->CharacterID(), *active_slot); if (task->type == TaskType::Quest) { - active_task_count++; + m_active_task_count++; } - p_task_manager->SendSingleActiveTaskToClient(client, *active_slot, false, true); + task_manager->SendSingleActiveTaskToClient(client, *active_slot, false, true); client->Message( Chat::White, "You have been assigned the task '%s'.", - p_task_manager->p_task_data[task_id]->title.c_str() + task_manager->m_task_data[task_id]->title.c_str() ); - p_task_manager->SaveClientState(client, this); + task_manager->SaveClientState(client, this); std::string buf = std::to_string(task_id); NPC *npc = entity_list.GetID(npc_type_id)->CastToNPC(); @@ -2160,7 +2160,7 @@ void ClientTaskState::ProcessTaskProximities(Client *client, float x, float y, f } LogTasksDetail("[ProcessTaskProximities] Checking proximities for Position x[{}] y[{}] z[{}]", x, y, z); - int explore_id = p_task_manager->proximity_manager.CheckProximities(x, y, z); + int explore_id = task_manager->m_proximity_manager.CheckProximities(x, y, z); if (explore_id > 0) { LogTasksDetail( "[ProcessTaskProximities] Position x[{}] y[{}] z[{}] is within proximity explore_id [{}]", diff --git a/zone/task_client_state.h b/zone/task_client_state.h index 676f5383e..6812e99c6 100644 --- a/zone/task_client_state.h +++ b/zone/task_client_state.h @@ -14,7 +14,7 @@ public: ClientTaskState(); ~ClientTaskState(); void ShowClientTasks(Client *client); - inline int GetActiveTaskCount() { return active_task_count; } + inline int GetActiveTaskCount() { return m_active_task_count; } int GetActiveTaskID(int index); bool IsTaskActivityCompleted(TaskType task_type, int index, int activity_id); int GetTaskActivityDoneCount(TaskType task_type, int index, int activity_id); @@ -55,7 +55,7 @@ public: int CompletedTasksInSet(int task_set_id); bool HasSlotForTask(TaskInformation *task); - inline bool HasFreeTaskSlot() { return active_task.task_id == TASKSLOTEMPTY; } + inline bool HasFreeTaskSlot() { return m_active_task.task_id == TASKSLOTEMPTY; } friend class TaskManager; @@ -69,20 +69,21 @@ private: int count = 1, bool ignore_quest_update = false ); + inline ClientTaskInformation *GetClientTaskInfo(TaskType task_type, int index) { ClientTaskInformation *info = nullptr; switch (task_type) { case TaskType::Task: if (index == 0) { - info = &active_task; + info = &m_active_task; } break; case TaskType::Shared: break; case TaskType::Quest: if (index < MAXACTIVEQUESTS) { - info = &active_quests[index]; + info = &m_active_quests[index]; } break; default: @@ -90,20 +91,20 @@ private: } return info; } - int active_task_count; union { // easier to loop over struct { - ClientTaskInformation active_task; // only one - ClientTaskInformation active_quests[MAXACTIVEQUESTS]; + ClientTaskInformation m_active_task; // only one + ClientTaskInformation m_active_quests[MAXACTIVEQUESTS]; }; - ClientTaskInformation active_tasks[MAXACTIVEQUESTS + 1]; + ClientTaskInformation m_active_tasks[MAXACTIVEQUESTS + 1]; }; // Shared tasks should be limited to 1 as well - std::vector enabled_tasks; - std::vector completed_tasks; - int last_completed_task_loaded; - bool checked_touch_activities; + int m_active_task_count; + std::vector m_enabled_tasks; + std::vector m_completed_tasks; + int m_last_completed_task_loaded; + bool m_checked_touch_activities; }; diff --git a/zone/task_manager.cpp b/zone/task_manager.cpp index 87d56d6d2..d55d5b980 100644 --- a/zone/task_manager.cpp +++ b/zone/task_manager.cpp @@ -12,14 +12,14 @@ TaskManager::TaskManager() { - for (auto &task : p_task_data) { + for (auto &task : m_task_data) { task = nullptr; } } TaskManager::~TaskManager() { - for (auto &task : p_task_data) { + for (auto &task : m_task_data) { if (task != nullptr) { safe_delete(task); } @@ -30,7 +30,7 @@ bool TaskManager::LoadTaskSets() { // Clear all task sets in memory. Done so we can reload them on the fly if required by just calling // this method again. - for (auto &task_set : task_sets) { + for (auto &task_set : m_task_sets) { task_set.clear(); } @@ -44,7 +44,7 @@ bool TaskManager::LoadTaskSets() ); for (auto &task_set: rows) { - task_sets[task_set.id].push_back(task_set.taskid); + m_task_sets[task_set.id].push_back(task_set.taskid); LogTasksDetail("[LoadTaskSets] Adding task_id [{}] to task_set [{}]", task_set.taskid, task_set.id); } @@ -53,7 +53,7 @@ bool TaskManager::LoadTaskSets() void TaskManager::ReloadGoalLists() { - if (!goal_list_manager.LoadLists()) { + if (!m_goal_list_manager.LoadLists()) { Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadLists failed"); } } @@ -63,7 +63,7 @@ bool TaskManager::LoadTasks(int single_task) std::string task_query_filter = fmt::format("id = {}", single_task); std::string query; if (single_task == 0) { - if (!goal_list_manager.LoadLists()) { + if (!m_goal_list_manager.LoadLists()) { LogTasks("[TaskManager::LoadTasks] LoadLists failed"); } @@ -87,25 +87,25 @@ bool TaskManager::LoadTasks(int single_task) } // load task data - p_task_data[task_id] = new TaskInformation; - p_task_data[task_id]->type = static_cast(task.type); - p_task_data[task_id]->duration = task.duration; - p_task_data[task_id]->duration_code = static_cast(task.duration_code); - p_task_data[task_id]->title = task.title; - p_task_data[task_id]->description = task.description; - p_task_data[task_id]->reward = task.reward; - p_task_data[task_id]->reward_id = task.rewardid; - p_task_data[task_id]->cash_reward = task.cashreward; - p_task_data[task_id]->experience_reward = task.xpreward; - p_task_data[task_id]->reward_method = (TaskMethodType) task.rewardmethod; - p_task_data[task_id]->faction_reward = task.faction_reward; - p_task_data[task_id]->min_level = task.minlevel; - p_task_data[task_id]->max_level = task.maxlevel; - p_task_data[task_id]->repeatable = task.repeatable; - p_task_data[task_id]->completion_emote = task.completion_emote; - p_task_data[task_id]->activity_count = 0; - p_task_data[task_id]->sequence_mode = ActivitiesSequential; - p_task_data[task_id]->last_step = 0; + m_task_data[task_id] = new TaskInformation; + m_task_data[task_id]->type = static_cast(task.type); + m_task_data[task_id]->duration = task.duration; + m_task_data[task_id]->duration_code = static_cast(task.duration_code); + m_task_data[task_id]->title = task.title; + m_task_data[task_id]->description = task.description; + m_task_data[task_id]->reward = task.reward; + m_task_data[task_id]->reward_id = task.rewardid; + m_task_data[task_id]->cash_reward = task.cashreward; + m_task_data[task_id]->experience_reward = task.xpreward; + m_task_data[task_id]->reward_method = (TaskMethodType) task.rewardmethod; + m_task_data[task_id]->faction_reward = task.faction_reward; + m_task_data[task_id]->min_level = task.minlevel; + m_task_data[task_id]->max_level = task.maxlevel; + m_task_data[task_id]->repeatable = task.repeatable; + m_task_data[task_id]->completion_emote = task.completion_emote; + m_task_data[task_id]->activity_count = 0; + m_task_data[task_id]->sequence_mode = ActivitiesSequential; + m_task_data[task_id]->last_step = 0; LogTasksDetail( "[LoadTasks] (Task) task_id [{}] type [{}] duration [{}] duration_code [{}] title [{}] description [{}] " @@ -155,8 +155,8 @@ bool TaskManager::LoadTasks(int single_task) int activity_id = task_activity.activityid; // create pointer to activity data since declarations get unruly long - int activity_index = p_task_data[task_id]->activity_count; - ActivityInformation *p_activity_data = &p_task_data[task_id]->activity_information[activity_index]; + int activity_index = m_task_data[task_id]->activity_count; + ActivityInformation *activity_data = &m_task_data[task_id]->activity_information[activity_index]; if ((task_id <= 0) || (task_id >= MAXTASKS) || (activity_id < 0) || (activity_id >= MAXACTIVITIESPERTASK)) { @@ -169,7 +169,7 @@ bool TaskManager::LoadTasks(int single_task) continue; } - if (p_task_data[task_id] == nullptr) { + if (m_task_data[task_id] == nullptr) { LogTasks( "Error: activity_information for non-existent task ([{}], [{}]) while loading activities from database", task_id, @@ -178,76 +178,76 @@ bool TaskManager::LoadTasks(int single_task) continue; } - p_task_data[task_id]->activity_information[p_task_data[task_id]->activity_count].step_number = step; + m_task_data[task_id]->activity_information[m_task_data[task_id]->activity_count].step_number = step; if (step != 0) { - p_task_data[task_id]->sequence_mode = ActivitiesStepped; + m_task_data[task_id]->sequence_mode = ActivitiesStepped; } - if (step > p_task_data[task_id]->last_step) { - p_task_data[task_id]->last_step = step; + if (step > m_task_data[task_id]->last_step) { + m_task_data[task_id]->last_step = step; } // Task Activities MUST be numbered sequentially from 0. If not, log an error // and set the task to nullptr. Subsequent activities for this task will raise // ERR_NOTASK errors. // Change to (activityID != (Tasks[taskID]->activity_count + 1)) to index from 1 - if (activity_id != p_task_data[task_id]->activity_count) { + if (activity_id != m_task_data[task_id]->activity_count) { LogError( "[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", task_id, activity_id ); - p_task_data[task_id] = nullptr; + m_task_data[task_id] = nullptr; continue; } // set activity data - p_activity_data->activity_type = task_activity.activitytype; - p_activity_data->target_name = task_activity.target_name; - p_activity_data->item_list = task_activity.item_list; - p_activity_data->skill_list = task_activity.skill_list; - p_activity_data->skill_id = std::stoi(task_activity.skill_list); // for older clients - p_activity_data->spell_list = task_activity.spell_list; - p_activity_data->spell_id = std::stoi(task_activity.spell_list); // for older clients - p_activity_data->description_override = task_activity.description_override; - p_activity_data->goal_id = task_activity.goalid; - p_activity_data->goal_method = (TaskMethodType) task_activity.goalmethod; - p_activity_data->goal_count = task_activity.goalcount; - p_activity_data->deliver_to_npc = task_activity.delivertonpc; + activity_data->activity_type = task_activity.activitytype; + activity_data->target_name = task_activity.target_name; + activity_data->item_list = task_activity.item_list; + activity_data->skill_list = task_activity.skill_list; + activity_data->skill_id = std::stoi(task_activity.skill_list); // for older clients + activity_data->spell_list = task_activity.spell_list; + activity_data->spell_id = std::stoi(task_activity.spell_list); // for older clients + activity_data->description_override = task_activity.description_override; + activity_data->goal_id = task_activity.goalid; + activity_data->goal_method = (TaskMethodType) task_activity.goalmethod; + activity_data->goal_count = task_activity.goalcount; + activity_data->deliver_to_npc = task_activity.delivertonpc; // zones - p_activity_data->zones = task_activity.zones; + activity_data->zones = task_activity.zones; auto zones = SplitString( task_activity.zones, ';' ); for (auto &&e : zones) { - p_activity_data->zone_ids.push_back(std::stoi(e)); + activity_data->zone_ids.push_back(std::stoi(e)); } - p_activity_data->optional = task_activity.optional; + activity_data->optional = task_activity.optional; LogTasksDetail( "[LoadTasks] (Activity) task_id [{}] activity_id [{}] slot [{}] activity_type [{}] goal_id [{}] goal_method [{}] goal_count [{}] zones [{}]" " target_name [{}] item_list [{}] skill_list [{}] spell_list [{}] description_override [{}]", task_id, activity_id, - p_task_data[task_id]->activity_count, - p_activity_data->activity_type, - p_activity_data->goal_id, - p_activity_data->goal_method, - p_activity_data->goal_count, - p_activity_data->zones.c_str(), - p_activity_data->target_name.c_str(), - p_activity_data->item_list.c_str(), - p_activity_data->skill_list.c_str(), - p_activity_data->spell_list.c_str(), - p_activity_data->description_override.c_str() + m_task_data[task_id]->activity_count, + activity_data->activity_type, + activity_data->goal_id, + activity_data->goal_method, + activity_data->goal_count, + activity_data->zones.c_str(), + activity_data->target_name.c_str(), + activity_data->item_list.c_str(), + activity_data->skill_list.c_str(), + activity_data->spell_list.c_str(), + activity_data->description_override.c_str() ); - p_task_data[task_id]->activity_count++; + m_task_data[task_id]->activity_count++; } LogTasks("Loaded [{}] Task Activities", task_activities.size()); @@ -271,9 +271,9 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s LogTasks("[SaveClientState] character_id [{}]", character_id); - if (client_task_state->active_task_count > 0 || - client_task_state->active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks - for (auto &active_task : client_task_state->active_tasks) { + if (client_task_state->m_active_task_count > 0 || + client_task_state->m_active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks + for (auto &active_task : client_task_state->m_active_tasks) { int task_id = active_task.task_id; if (task_id == TASKSLOTEMPTY) { continue; @@ -295,7 +295,7 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s character_id, task_id, slot, - static_cast(p_task_data[task_id]->type), + static_cast(m_task_data[task_id]->type), active_task.accepted_time ); @@ -314,7 +314,7 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s int updated_activity_count = 0; - for (int activity_index = 0; activity_index < p_task_data[task_id]->activity_count; ++activity_index) { + for (int activity_index = 0; activity_index < m_task_data[task_id]->activity_count; ++activity_index) { if (!active_task.activity[activity_index].updated) { continue; } @@ -362,28 +362,28 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s active_task.updated = false; for (int activity_index = 0; - activity_index < p_task_data[task_id]->activity_count; + activity_index < m_task_data[task_id]->activity_count; ++activity_index) active_task.activity[activity_index].updated = false; } } if (!RuleB(TaskSystem, RecordCompletedTasks) || - (client_task_state->completed_tasks.size() <= (unsigned int) client_task_state->last_completed_task_loaded)) { - client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); + (client_task_state->m_completed_tasks.size() <= (unsigned int) client_task_state->m_last_completed_task_loaded)) { + client_task_state->m_last_completed_task_loaded = client_task_state->m_completed_tasks.size(); return true; } const char *completed_task_query = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " "VALUES (%i, %i, %i, %i)"; - for (unsigned int task_index = client_task_state->last_completed_task_loaded; - task_index < client_task_state->completed_tasks.size(); + for (unsigned int task_index = client_task_state->m_last_completed_task_loaded; + task_index < client_task_state->m_completed_tasks.size(); task_index++) { - int task_id = client_task_state->completed_tasks[task_index].task_id; + int task_id = client_task_state->m_completed_tasks[task_index].task_id; - if ((task_id <= 0) || (task_id >= MAXTASKS) || (p_task_data[task_id] == nullptr)) { + if ((task_id <= 0) || (task_id >= MAXTASKS) || (m_task_data[task_id] == nullptr)) { continue; } @@ -394,7 +394,7 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s std::string query = StringFormat( completed_task_query, character_id, - client_task_state->completed_tasks[task_index].completed_time, + client_task_state->m_completed_tasks[task_index].completed_time, task_id, -1 ); @@ -411,16 +411,16 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s } // Insert one record for each completed optional task. - for (int activity_id = 0; activity_id < p_task_data[task_id]->activity_count; activity_id++) { - if (!p_task_data[task_id]->activity_information[activity_id].optional || - !client_task_state->completed_tasks[task_index].activity_done[activity_id]) { + for (int activity_id = 0; activity_id < m_task_data[task_id]->activity_count; activity_id++) { + if (!m_task_data[task_id]->activity_information[activity_id].optional || + !client_task_state->m_completed_tasks[task_index].activity_done[activity_id]) { continue; } query = StringFormat( completed_task_query, character_id, - client_task_state->completed_tasks[task_index].completed_time, + client_task_state->m_completed_tasks[task_index].completed_time, task_id, activity_id ); @@ -431,7 +431,7 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_s } } - client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); + client_task_state->m_last_completed_task_loaded = client_task_state->m_completed_tasks.size(); return true; } @@ -441,12 +441,12 @@ int TaskManager::FirstTaskInSet(int task_set) return 0; } - if (task_sets[task_set].empty()) { + if (m_task_sets[task_set].empty()) { return 0; } - auto iterator = task_sets[task_set].begin(); - while (iterator != task_sets[task_set].end()) { + auto iterator = m_task_sets[task_set].begin(); + while (iterator != m_task_sets[task_set].end()) { if ((*iterator) > 0) { return (*iterator); } @@ -462,11 +462,11 @@ int TaskManager::LastTaskInSet(int task_set) return 0; } - if (task_sets[task_set].empty()) { + if (m_task_sets[task_set].empty()) { return 0; } - return task_sets[task_set][task_sets[task_set].size() - 1]; + return m_task_sets[task_set][m_task_sets[task_set].size() - 1]; } int TaskManager::NextTaskInSet(int task_set, int task_id) @@ -475,11 +475,11 @@ int TaskManager::NextTaskInSet(int task_set, int task_id) return 0; } - if (task_sets[task_set].empty()) { + if (m_task_sets[task_set].empty()) { return 0; } - for (int i : task_sets[task_set]) { + for (int i : m_task_sets[task_set]) { if (i > task_id) { return i; } @@ -490,15 +490,15 @@ int TaskManager::NextTaskInSet(int task_set, int task_id) bool TaskManager::ValidateLevel(int task_id, int player_level) { - if (p_task_data[task_id] == nullptr) { + if (m_task_data[task_id] == nullptr) { return false; } - if (p_task_data[task_id]->min_level && (player_level < p_task_data[task_id]->min_level)) { + if (m_task_data[task_id]->min_level && (player_level < m_task_data[task_id]->min_level)) { return false; } - if (p_task_data[task_id]->max_level && (player_level > p_task_data[task_id]->max_level)) { + if (m_task_data[task_id]->max_level && (player_level > m_task_data[task_id]->max_level)) { return false; } @@ -508,8 +508,8 @@ bool TaskManager::ValidateLevel(int task_id, int player_level) std::string TaskManager::GetTaskName(uint32 task_id) { if (task_id > 0 && task_id < MAXTASKS) { - if (p_task_data[task_id] != nullptr) { - return p_task_data[task_id]->title; + if (m_task_data[task_id] != nullptr) { + return m_task_data[task_id]->title; } } @@ -519,8 +519,8 @@ std::string TaskManager::GetTaskName(uint32 task_id) TaskType TaskManager::GetTaskType(uint32 task_id) { if (task_id > 0 && task_id < MAXTASKS) { - if (p_task_data[task_id] != nullptr) { - return p_task_data[task_id]->type; + if (m_task_data[task_id] != nullptr) { + return m_task_data[task_id]->type; } } return TaskType::Task; @@ -535,14 +535,14 @@ void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_s LogTasks( "TaskSetSelector called for task_set_id [{}] EnableTaskSize is [{}]", task_set_id, - client_task_state->enabled_tasks.size() + client_task_state->m_enabled_tasks.size() ); if (task_set_id <= 0 || task_set_id >= MAXTASKSETS) { return; } - if (task_sets[task_set_id].empty()) { + if (m_task_sets[task_set_id].empty()) { // I think this is suppose to be yellow mob->SayString( client, @@ -556,22 +556,22 @@ void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_s bool all_enabled = false; // A task_id of 0 in a TaskSet indicates that all Tasks in the set are enabled for all players. - if (task_sets[task_set_id][0] == 0) { + if (m_task_sets[task_set_id][0] == 0) { LogTasks("[TaskSetSelector] TaskSets[{}][0] == 0. All Tasks in Set enabled.", task_set_id); all_enabled = true; } - auto iterator = task_sets[task_set_id].begin(); + auto iterator = m_task_sets[task_set_id].begin(); if (all_enabled) { ++iterator; } // skip first when all enabled since it's useless data - while (iterator != task_sets[task_set_id].end() && task_list_index < MAXCHOOSERENTRIES) { + while (iterator != m_task_sets[task_set_id].end() && task_list_index < MAXCHOOSERENTRIES) { auto task = *iterator; // verify level, we're not currently on it, repeatable status, if it's a (shared) task // we aren't currently on another, and if it's enabled if not all_enabled if ((all_enabled || client_task_state->IsTaskEnabled(task)) && ValidateLevel(task, player_level) && - !client_task_state->IsTaskActive(task) && client_task_state->HasSlotForTask(p_task_data[task]) && + !client_task_state->IsTaskActive(task) && client_task_state->HasSlotForTask(m_task_data[task]) && // this slot checking is a bit silly, but we allow mixing of task types ... (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { task_list[task_list_index++] = task; @@ -619,7 +619,7 @@ void TaskManager::TaskQuestSetSelector( // verify level, we're not currently on it, repeatable status, if it's a (shared) task // we aren't currently on another, and if it's enabled if not all_enabled if (ValidateLevel(task, player_level) && !client_task_state->IsTaskActive(task) && - client_task_state->HasSlotForTask(p_task_data[task]) && + client_task_state->HasSlotForTask(m_task_data[task]) && // this slot checking is a bit silly, but we allow mixing of task types ... (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { task_list[task_list_index++] = task; @@ -653,7 +653,7 @@ void TaskManager::SendTaskSelector(Client *client, Mob *mob, int task_count, int // Check if any of the tasks exist for (int i = 0; i < task_count; i++) { - if (p_task_data[task_list[i]] != nullptr) { + if (m_task_data[task_list[i]] != nullptr) { break; } } @@ -701,24 +701,24 @@ void TaskManager::SendTaskSelector(Client *client, Mob *mob, int task_count, int if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { buf.WriteFloat(1.0f); } - buf.WriteUInt32(p_task_data[task_list[task_index]]->duration); - buf.WriteUInt32(static_cast(p_task_data[task_list[task_index]]->duration_code)); + buf.WriteUInt32(m_task_data[task_list[task_index]]->duration); + buf.WriteUInt32(static_cast(m_task_data[task_list[task_index]]->duration_code)); - buf.WriteString(p_task_data[task_list[task_index]]->title); // max 64 with null - buf.WriteString(p_task_data[task_list[task_index]]->description); // max 4000 with null + buf.WriteString(m_task_data[task_list[task_index]]->title); // max 64 with null + buf.WriteString(m_task_data[task_list[task_index]]->description); // max 4000 with null // Has reward set flag if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { buf.WriteUInt8(0); } - buf.WriteUInt32(p_task_data[task_list[task_index]]->activity_count); + buf.WriteUInt32(m_task_data[task_list[task_index]]->activity_count); for (int activity_index = 0; - activity_index < p_task_data[task_list[task_index]]->activity_count; + activity_index < m_task_data[task_list[task_index]]->activity_count; ++activity_index) { buf.WriteUInt32(activity_index); // ActivityNumber - auto &activity = p_task_data[task_list[task_index]]->activity_information[activity_index]; + auto &activity = m_task_data[task_list[task_index]]->activity_information[activity_index]; buf.WriteUInt32(activity.activity_type); buf.WriteUInt32(0); // solo, group, raid? buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) @@ -745,7 +745,7 @@ void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, // Check if any of the tasks exist for (int i = 0; i < task_count; i++) { - if (p_task_data[task_list[i]] != nullptr) { + if (m_task_data[task_list[i]] != nullptr) { break; } } @@ -790,18 +790,18 @@ void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, buf.WriteUInt32(task_list[i]); // task_id buf.WriteFloat(1.0f); // affects color, difficulty? - buf.WriteUInt32(p_task_data[task_list[i]]->duration); - buf.WriteUInt32(static_cast(p_task_data[task_list[i]]->duration_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited + buf.WriteUInt32(m_task_data[task_list[i]]->duration); + buf.WriteUInt32(static_cast(m_task_data[task_list[i]]->duration_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited - buf.WriteString(p_task_data[task_list[i]]->title); // max 64 with null - buf.WriteString(p_task_data[task_list[i]]->description); // max 4000 with null + buf.WriteString(m_task_data[task_list[i]]->title); // max 64 with null + buf.WriteString(m_task_data[task_list[i]]->description); // max 4000 with null buf.WriteUInt8(0); // Has reward set flag - buf.WriteUInt32(p_task_data[task_list[i]]->activity_count); // activity_count + buf.WriteUInt32(m_task_data[task_list[i]]->activity_count); // activity_count - for (int j = 0; j < p_task_data[task_list[i]]->activity_count; ++j) { + for (int j = 0; j < m_task_data[task_list[i]]->activity_count; ++j) { buf.WriteUInt32(j); // ActivityNumber - auto &activity = p_task_data[task_list[i]]->activity_information[j]; + auto &activity = m_task_data[task_list[i]]->activity_information[j]; buf.WriteUInt32(activity.activity_type); // ActivityType buf.WriteUInt32(0); // solo, group, raid? buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) @@ -834,7 +834,7 @@ void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, int TaskManager::GetActivityCount(int task_id) { if ((task_id > 0) && (task_id < MAXTASKS)) { - if (p_task_data[task_id]) { return p_task_data[task_id]->activity_count; } + if (m_task_data[task_id]) { return m_task_data[task_id]->activity_count; } } return 0; @@ -855,20 +855,20 @@ void TaskManager::ExplainTask(Client *client, int task_id) return; } - if (p_task_data[task_id] == nullptr) { + if (m_task_data[task_id] == nullptr) { client->Message(Chat::White, "Task does not exist."); return; } char explanation[1000], *ptr; - client->Message(Chat::White, "Task %4i: title: %s", task_id, p_task_data[task_id]->description.c_str()); - client->Message(Chat::White, "%3i Activities", p_task_data[task_id]->activity_count); + client->Message(Chat::White, "Task %4i: title: %s", task_id, m_task_data[task_id]->description.c_str()); + client->Message(Chat::White, "%3i Activities", m_task_data[task_id]->activity_count); ptr = explanation; - for (int i = 0; i < p_task_data[task_id]->activity_count; i++) { + for (int i = 0; i < m_task_data[task_id]->activity_count; i++) { sprintf(ptr, "Act: %3i: ", i); ptr = ptr + strlen(ptr); - switch (p_task_data[task_id]->activity_information[i].activity_type) { + switch (m_task_data[task_id]->activity_information[i].activity_type) { case ActivityDeliver: sprintf(ptr, "Deliver"); break; @@ -883,7 +883,7 @@ bool TaskManager::IsTaskRepeatable(int task_id) return false; } - TaskInformation *task_data = p_task_manager->p_task_data[task_id]; + TaskInformation *task_data = task_manager->m_task_data[task_id]; if (task_data == nullptr) { return false; } @@ -898,15 +898,15 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *client_ //vector::const_iterator iterator; // The client only display the first 50 Completed Tasks send, so send the 50 most recent int first_task_to_send = 0; - int last_task_to_send = client_task_state->completed_tasks.size(); + int last_task_to_send = client_task_state->m_completed_tasks.size(); - if (client_task_state->completed_tasks.size() > 50) { - first_task_to_send = client_task_state->completed_tasks.size() - 50; + if (client_task_state->m_completed_tasks.size() > 50) { + first_task_to_send = client_task_state->m_completed_tasks.size() - 50; } LogTasks( "[SendCompletedTasksToClient] completed task count [{}] first tank to send is [{}] last is [{}]", - client_task_state->completed_tasks.size(), + client_task_state->m_completed_tasks.size(), first_task_to_send, last_task_to_send ); @@ -919,9 +919,9 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *client_ } */ for (int i = first_task_to_send; i < last_task_to_send; i++) { - int TaskID = client_task_state->completed_tasks[i].task_id; - if (p_task_data[TaskID] == nullptr) { continue; } - packet_length = packet_length + 8 + p_task_data[TaskID]->title.size() + 1; + int TaskID = client_task_state->m_completed_tasks[i].task_id; + if (m_task_data[TaskID] == nullptr) { continue; } + packet_length = packet_length + 8 + m_task_data[TaskID]->title.size() + 1; } auto outapp = new EQApplicationPacket(OP_CompletedTasks, packet_length); @@ -933,15 +933,15 @@ void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *client_ //for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { // int task_id = (*iterator).task_id; for (int i = first_task_to_send; i < last_task_to_send; i++) { - int task_id = client_task_state->completed_tasks[i].task_id; - if (p_task_data[task_id] == nullptr) { continue; } + int task_id = client_task_state->m_completed_tasks[i].task_id; + if (m_task_data[task_id] == nullptr) { continue; } *(uint32 *) buf = task_id; buf = buf + 4; - sprintf(buf, "%s", p_task_data[task_id]->title.c_str()); + sprintf(buf, "%s", m_task_data[task_id]->title.c_str()); buf = buf + strlen(buf) + 1; //*(uint32 *)buf = (*iterator).CompletedTime; - *(uint32 *) buf = client_task_state->completed_tasks[i].completed_time; + *(uint32 *) buf = client_task_state->m_completed_tasks[i].completed_time; buf = buf + 4; } @@ -958,7 +958,7 @@ void TaskManager::SendTaskActivityShort(Client *client, int task_id, int activit if (client->ClientVersionBit() & EQ::versions::maskRoFAndLater) { auto outapp = new EQApplicationPacket(OP_TaskActivity, 25); outapp->WriteUInt32(client_task_index); - outapp->WriteUInt32(static_cast(p_task_data[task_id]->type)); + outapp->WriteUInt32(static_cast(m_task_data[task_id]->type)); outapp->WriteUInt32(task_id); outapp->WriteUInt32(activity_id); outapp->WriteUInt32(0); @@ -973,7 +973,7 @@ void TaskManager::SendTaskActivityShort(Client *client, int task_id, int activit task_activity_short = (TaskActivityShort_Struct *) outapp->pBuffer; task_activity_short->TaskSequenceNumber = client_task_index; - task_activity_short->unknown2 = static_cast(p_task_data[task_id]->type); + task_activity_short->unknown2 = static_cast(m_task_data[task_id]->type); task_activity_short->TaskID = task_id; task_activity_short->ActivityID = activity_id; task_activity_short->unknown3 = 0x000000; @@ -1002,16 +1002,16 @@ void TaskManager::SendTaskActivityLong( SerializeBuffer buf(100); buf.WriteUInt32(client_task_index); - buf.WriteUInt32(static_cast(p_task_data[task_id]->type)); + buf.WriteUInt32(static_cast(m_task_data[task_id]->type)); buf.WriteUInt32(task_id); buf.WriteUInt32(activity_id); buf.WriteUInt32(0); // unknown3 // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes // no difference to the client. All activity_information updates will be done based on our interal activity_information types. - if ((p_task_data[task_id]->activity_information[activity_id].activity_type > 0) && - p_task_data[task_id]->activity_information[activity_id].activity_type < 100) { - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].activity_type); + if ((m_task_data[task_id]->activity_information[activity_id].activity_type > 0) && + m_task_data[task_id]->activity_information[activity_id].activity_type < 100) { + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].activity_type); } else { buf.WriteUInt32(ActivityCastOn); @@ -1020,11 +1020,11 @@ void TaskManager::SendTaskActivityLong( buf.WriteUInt32(optional); buf.WriteUInt32(0); // solo, group, raid - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].target_name); // target name string - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].item_list); // item name list + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].target_name); // target name string + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].item_list); // item name list - if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].goal_count); + if (m_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].goal_count); } else { // For our internal type GiveCash, where the goal count has the amount of cash that must be given, @@ -1034,22 +1034,22 @@ void TaskManager::SendTaskActivityLong( buf.WriteUInt32(1); } - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].skill_id); - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].spell_id); + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].skill_id); + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].spell_id); buf.WriteUInt32( - p_task_data[task_id]->activity_information[activity_id].zone_ids.empty() ? 0 - : p_task_data[task_id]->activity_information[activity_id].zone_ids.front()); + m_task_data[task_id]->activity_information[activity_id].zone_ids.empty() ? 0 + : m_task_data[task_id]->activity_information[activity_id].zone_ids.front()); buf.WriteUInt32(0); - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].description_override); + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].description_override); - if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { - buf.WriteUInt32(client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id)); + if (m_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(client->GetTaskActivityDoneCount(m_task_data[task_id]->type, client_task_index, activity_id)); } else { // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. - buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= - p_task_data[task_id]->activity_information[activity_id].goal_count)); + buf.WriteUInt32((client->GetTaskActivityDoneCount(m_task_data[task_id]->type, client_task_index, activity_id) >= + m_task_data[task_id]->activity_information[activity_id].goal_count)); } buf.WriteUInt32(1); // unknown @@ -1074,16 +1074,16 @@ void TaskManager::SendTaskActivityNew( SerializeBuffer buf(100); buf.WriteUInt32(client_task_index); // TaskSequenceNumber - buf.WriteUInt32(static_cast(p_task_data[task_id]->type)); // task type + buf.WriteUInt32(static_cast(m_task_data[task_id]->type)); // task type buf.WriteUInt32(task_id); buf.WriteUInt32(activity_id); buf.WriteUInt32(0); // unknown3 // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes // no difference to the client. All activity_information updates will be done based on our interal activity_information types. - if ((p_task_data[task_id]->activity_information[activity_id].activity_type > 0) && - p_task_data[task_id]->activity_information[activity_id].activity_type < 100) { - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].activity_type); + if ((m_task_data[task_id]->activity_information[activity_id].activity_type > 0) && + m_task_data[task_id]->activity_information[activity_id].activity_type < 100) { + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].activity_type); } else { buf.WriteUInt32(ActivityCastOn); @@ -1093,46 +1093,46 @@ void TaskManager::SendTaskActivityNew( buf.WriteUInt32(0); // solo, group, raid // One of these unknown fields maybe related to the 'Use On' activity_information types - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].target_name); // target name string + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].target_name); // target name string - buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].item_list); // item name list + buf.WriteLengthString(m_task_data[task_id]->activity_information[activity_id].item_list); // item name list // Goal Count - if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { - buf.WriteUInt32(p_task_data[task_id]->activity_information[activity_id].goal_count); + if (m_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].goal_count); } else { buf.WriteUInt32(1); } // GoalCount // skill ID list ; separated - buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].skill_list); + buf.WriteLengthString(m_task_data[task_id]->activity_information[activity_id].skill_list); // spelll ID list ; separated -- unsure wtf we're doing here - buf.WriteLengthString(p_task_data[task_id]->activity_information[activity_id].spell_list); + buf.WriteLengthString(m_task_data[task_id]->activity_information[activity_id].spell_list); - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].zones); + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].zones); buf.WriteUInt32(0); // unknown7 - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].description_override); // description override + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].description_override); // description override - if (p_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + if (m_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { buf.WriteUInt32( client->GetTaskActivityDoneCount( - p_task_data[task_id]->type, + m_task_data[task_id]->type, client_task_index, activity_id )); // done_count } else { // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. - buf.WriteUInt32((client->GetTaskActivityDoneCount(p_task_data[task_id]->type, client_task_index, activity_id) >= - p_task_data[task_id]->activity_information[activity_id].goal_count)); + buf.WriteUInt32((client->GetTaskActivityDoneCount(m_task_data[task_id]->type, client_task_index, activity_id) >= + m_task_data[task_id]->activity_information[activity_id].goal_count)); } buf.WriteUInt8(1); // unknown9 - buf.WriteString(p_task_data[task_id]->activity_information[activity_id].zones); + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].zones); auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); @@ -1149,22 +1149,22 @@ void TaskManager::SendActiveTasksToClient(Client *client, bool task_complete) } for (int task_index = 0; task_index < MAXACTIVEQUESTS + 1; task_index++) { - int task_id = state->active_tasks[task_index].task_id; - if ((task_id == 0) || (p_task_data[task_id] == 0)) { + int task_id = state->m_active_tasks[task_index].task_id; + if ((task_id == 0) || (m_task_data[task_id] == 0)) { continue; } - int start_time = state->active_tasks[task_index].accepted_time; + int start_time = state->m_active_tasks[task_index].accepted_time; SendActiveTaskDescription( - client, task_id, state->active_tasks[task_index], start_time, p_task_data[task_id]->duration, + client, task_id, state->m_active_tasks[task_index], start_time, m_task_data[task_id]->duration, false ); LogTasks("[SendActiveTasksToClient] task_id [{}] activity_count [{}]", task_id, GetActivityCount(task_id)); int sequence = 0; - int fixed_index = p_task_data[task_id]->type == TaskType::Task ? 0 : task_index - 1; // hmmm fuck + int fixed_index = m_task_data[task_id]->type == TaskType::Task ? 0 : task_index - 1; // hmmm fuck for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { - if (client->GetTaskActivityState(p_task_data[task_id]->type, fixed_index, activity_id) != ActivityHidden) { + if (client->GetTaskActivityState(m_task_data[task_id]->type, fixed_index, activity_id) != ActivityHidden) { LogTasks( "[SendActiveTasksToClient] (Long Update) task_id [{}] activity_id [{}] fixed_index [{}] task_complete [{}]", task_id, @@ -1179,7 +1179,7 @@ void TaskManager::SendActiveTasksToClient(Client *client, bool task_complete) task_id, activity_id, fixed_index, - p_task_data[task_id]->activity_information[activity_id].optional, + m_task_data[task_id]->activity_information[activity_id].optional, task_complete ); } @@ -1189,7 +1189,7 @@ void TaskManager::SendActiveTasksToClient(Client *client, bool task_complete) task_id, activity_id, fixed_index, - p_task_data[task_id]->activity_information[activity_id].optional, + m_task_data[task_id]->activity_information[activity_id].optional, 0 ); } @@ -1215,7 +1215,7 @@ void TaskManager::SendSingleActiveTaskToClient( ) { int task_id = task_info.task_id; - if (task_id == 0 || p_task_data[task_id] == nullptr) { + if (task_id == 0 || m_task_data[task_id] == nullptr) { return; } @@ -1225,7 +1225,7 @@ void TaskManager::SendSingleActiveTaskToClient( task_id, task_info, start_time, - p_task_data[task_id]->duration, + m_task_data[task_id]->duration, bring_up_task_journal ); Log(Logs::General, @@ -1243,13 +1243,13 @@ void TaskManager::SendSingleActiveTaskToClient( if (activity_id == GetActivityCount(task_id) - 1) { SendTaskActivityLong( client, task_id, activity_id, task_info.slot, - p_task_data[task_id]->activity_information[activity_id].optional, task_complete + m_task_data[task_id]->activity_information[activity_id].optional, task_complete ); } else { SendTaskActivityLong( client, task_id, activity_id, task_info.slot, - p_task_data[task_id]->activity_information[activity_id].optional, 0 + m_task_data[task_id]->activity_information[activity_id].optional, 0 ); } } @@ -1269,25 +1269,25 @@ void TaskManager::SendActiveTaskDescription( bool bring_up_task_journal ) { - if ((task_id < 1) || (task_id >= MAXTASKS) || !p_task_data[task_id]) { + if ((task_id < 1) || (task_id >= MAXTASKS) || !m_task_data[task_id]) { return; } - int packet_length = sizeof(TaskDescriptionHeader_Struct) + p_task_data[task_id]->title.length() + 1 - + sizeof(TaskDescriptionData1_Struct) + p_task_data[task_id]->description.length() + 1 + int packet_length = sizeof(TaskDescriptionHeader_Struct) + m_task_data[task_id]->title.length() + 1 + + sizeof(TaskDescriptionData1_Struct) + m_task_data[task_id]->description.length() + 1 + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); // If there is an item make the reward text into a link to the item (only the first item if a list // is specified). I have been unable to get multiple item links to work. // - if (p_task_data[task_id]->reward_id && p_task_data[task_id]->item_link.empty()) { + if (m_task_data[task_id]->reward_id && m_task_data[task_id]->item_link.empty()) { int item_id = 0; // If the reward is a list of items, and the first entry on the list is valid - if (p_task_data[task_id]->reward_method == METHODSINGLEID) { - item_id = p_task_data[task_id]->reward_id; + if (m_task_data[task_id]->reward_method == METHODSINGLEID) { + item_id = m_task_data[task_id]->reward_id; } - else if (p_task_data[task_id]->reward_method == METHODLIST) { - item_id = goal_list_manager.GetFirstEntry(p_task_data[task_id]->reward_id); + else if (m_task_data[task_id]->reward_method == METHODLIST) { + item_id = m_goal_list_manager.GetFirstEntry(m_task_data[task_id]->reward_id); if (item_id < 0) { item_id = 0; } @@ -1300,11 +1300,11 @@ void TaskManager::SendActiveTaskDescription( linker.SetLinkType(EQ::saylink::SayLinkItemData); linker.SetItemData(reward_item); linker.SetTaskUse(); - p_task_data[task_id]->item_link = linker.GenerateLink(); + m_task_data[task_id]->item_link = linker.GenerateLink(); } } - packet_length += p_task_data[task_id]->reward.length() + 1 + p_task_data[task_id]->item_link.length() + 1; + packet_length += m_task_data[task_id]->reward.length() + 1 + m_task_data[task_id]->item_link.length() + 1; char *Ptr; TaskDescriptionHeader_Struct *task_description_header; @@ -1319,25 +1319,25 @@ void TaskManager::SendActiveTaskDescription( task_description_header->SequenceNumber = task_info.slot; task_description_header->TaskID = task_id; task_description_header->open_window = bring_up_task_journal; - task_description_header->task_type = static_cast(p_task_data[task_id]->type); + task_description_header->task_type = static_cast(m_task_data[task_id]->type); task_description_header->reward_type = 0; // TODO: 4 says Radiant Crystals else Ebon Crystals when shared task Ptr = (char *) task_description_header + sizeof(TaskDescriptionHeader_Struct); - sprintf(Ptr, "%s", p_task_data[task_id]->title.c_str()); - Ptr += p_task_data[task_id]->title.length() + 1; + sprintf(Ptr, "%s", m_task_data[task_id]->title.c_str()); + Ptr += m_task_data[task_id]->title.length() + 1; tdd1 = (TaskDescriptionData1_Struct *) Ptr; tdd1->Duration = duration; - tdd1->dur_code = static_cast(p_task_data[task_id]->duration_code); + tdd1->dur_code = static_cast(m_task_data[task_id]->duration_code); tdd1->StartTime = start_time; Ptr = (char *) tdd1 + sizeof(TaskDescriptionData1_Struct); - sprintf(Ptr, "%s", p_task_data[task_id]->description.c_str()); - Ptr += p_task_data[task_id]->description.length() + 1; + sprintf(Ptr, "%s", m_task_data[task_id]->description.c_str()); + Ptr += m_task_data[task_id]->description.length() + 1; tdd2 = (TaskDescriptionData2_Struct *) Ptr; @@ -1346,20 +1346,20 @@ void TaskManager::SendActiveTaskDescription( // "has_reward_selection" is after this bool! Smaller packet when this is 0 tdd2->has_rewards = 1; - tdd2->coin_reward = p_task_data[task_id]->cash_reward; - tdd2->xp_reward = p_task_data[task_id]->experience_reward ? 1 : 0; // just booled - tdd2->faction_reward = p_task_data[task_id]->faction_reward ? 1 : 0; // faction booled + tdd2->coin_reward = m_task_data[task_id]->cash_reward; + tdd2->xp_reward = m_task_data[task_id]->experience_reward ? 1 : 0; // just booled + tdd2->faction_reward = m_task_data[task_id]->faction_reward ? 1 : 0; // faction booled Ptr = (char *) tdd2 + sizeof(TaskDescriptionData2_Struct); // we actually have 2 strings here. One is max length 96 and not parsed for item links // We actually skipped past that string incorrectly before, so TODO: fix item link string - sprintf(Ptr, "%s", p_task_data[task_id]->reward.c_str()); - Ptr += p_task_data[task_id]->reward.length() + 1; + sprintf(Ptr, "%s", m_task_data[task_id]->reward.c_str()); + Ptr += m_task_data[task_id]->reward.length() + 1; // second string is parsed for item links - sprintf(Ptr, "%s", p_task_data[task_id]->item_link.c_str()); - Ptr += p_task_data[task_id]->item_link.length() + 1; + sprintf(Ptr, "%s", m_task_data[task_id]->item_link.c_str()); + Ptr += m_task_data[task_id]->item_link.length() + 1; tdt = (TaskDescriptionTrailer_Struct *) Ptr; tdt->Points = 0x00000000; // Points Count TODO: this does have a visible affect on the client ... @@ -1377,7 +1377,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s int character_id = client->CharacterID(); - client_task_state->active_task_count = 0; + client_task_state->m_active_task_count = 0; LogTasks("[LoadClientState] for character_id [{}]", character_id); @@ -1424,7 +1424,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s } if (type == TaskType::Quest) { - ++client_task_state->active_task_count; + ++client_task_state->m_active_task_count; } LogTasks( @@ -1466,13 +1466,13 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s } ClientTaskInformation *task_info = nullptr; - if (client_task_state->active_task.task_id == task_id) { - task_info = &client_task_state->active_task; + if (client_task_state->m_active_task.task_id == task_id) { + task_info = &client_task_state->m_active_task; } // wasn't task if (task_info == nullptr) { - for (auto &active_quest : client_task_state->active_quests) { + for (auto &active_quest : client_task_state->m_active_quests) { if (active_quest.task_id == task_id) { task_info = &active_quest; } @@ -1547,7 +1547,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s int completed_time = character_completed_task.completedtime; if ((previous_task_id != -1) && ((task_id != previous_task_id) || (completed_time != previous_completed_time))) { - client_task_state->completed_tasks.push_back(completed_task_information); + client_task_state->m_completed_tasks.push_back(completed_task_information); for (bool &activity_done : completed_task_information.activity_done) { activity_done = false; } @@ -1558,7 +1558,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s // If activity_id is -1, Mark all the non-optional tasks as completed. if (activity_id < 0) { - TaskInformation *task = p_task_data[task_id]; + TaskInformation *task = m_task_data[task_id]; if (task == nullptr) { continue; } @@ -1575,10 +1575,10 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s } if (previous_task_id != -1) { - client_task_state->completed_tasks.push_back(completed_task_information); + client_task_state->m_completed_tasks.push_back(completed_task_information); } - client_task_state->last_completed_task_loaded = client_task_state->completed_tasks.size(); + client_task_state->m_last_completed_task_loaded = client_task_state->m_completed_tasks.size(); } std::string query = StringFormat( @@ -1592,7 +1592,7 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s if (results.Success()) { for (auto row = results.begin(); row != results.end(); ++row) { int task_id = atoi(row[0]); - client_task_state->enabled_tasks.push_back(task_id); + client_task_state->m_enabled_tasks.push_back(task_id); LogTasksDetail("[LoadClientState] Adding task_id [{}] to enabled tasks", task_id); } } @@ -1601,11 +1601,11 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s // This should only break if a ServerOP adds or deletes activites for a task that players already // have active, or due to a bug. for (int task_index = 0; task_index < MAXACTIVEQUESTS + 1; task_index++) { - int task_id = client_task_state->active_tasks[task_index].task_id; + int task_id = client_task_state->m_active_tasks[task_index].task_id; if (task_id == TASKSLOTEMPTY) { continue; } - if (!p_task_data[task_id]) { + if (!m_task_data[task_id]) { client->Message( Chat::Red, "Active Task Slot %i, references a task (%i), that does not exist. " @@ -1615,16 +1615,16 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s ); LogError("[LoadClientState] Character [{}] has task [{}] which does not exist", character_id, task_id); - client_task_state->active_tasks[task_index].task_id = TASKSLOTEMPTY; + client_task_state->m_active_tasks[task_index].task_id = TASKSLOTEMPTY; continue; } - for (int activity_index = 0; activity_index < p_task_data[task_id]->activity_count; activity_index++) { - if (client_task_state->active_tasks[task_index].activity[activity_index].activity_id != activity_index) { + for (int activity_index = 0; activity_index < m_task_data[task_id]->activity_count; activity_index++) { + if (client_task_state->m_active_tasks[task_index].activity[activity_index].activity_id != activity_index) { client->Message( Chat::Red, "Active Task %i, %s. activity_information count does not match expected value." "Removing from memory. Contact a GM to resolve this.", - task_id, p_task_data[task_id]->title.c_str() + task_id, m_task_data[task_id]->title.c_str() ); LogTasks( @@ -1633,18 +1633,18 @@ bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_s activity_index, task_id ); - client_task_state->active_tasks[task_index].task_id = TASKSLOTEMPTY; + client_task_state->m_active_tasks[task_index].task_id = TASKSLOTEMPTY; break; } } } - if (client_task_state->active_task.task_id != TASKSLOTEMPTY) { - client_task_state->UnlockActivities(character_id, client_task_state->active_task); + if (client_task_state->m_active_task.task_id != TASKSLOTEMPTY) { + client_task_state->UnlockActivities(character_id, client_task_state->m_active_task); } // TODO: shared - for (auto &active_quest : client_task_state->active_quests) { + for (auto &active_quest : client_task_state->m_active_quests) { if (active_quest.task_id != TASKSLOTEMPTY) { client_task_state->UnlockActivities(character_id, active_quest); } diff --git a/zone/task_manager.h b/zone/task_manager.h index 83994a058..f1fe41bd9 100644 --- a/zone/task_manager.h +++ b/zone/task_manager.h @@ -25,7 +25,7 @@ public: void ReloadGoalLists(); inline void LoadProximities(int zone_id) { - proximity_manager.LoadProximities(zone_id); + m_proximity_manager.LoadProximities(zone_id); } bool LoadTaskSets(); bool LoadClientState(Client *client, ClientTaskState *client_task_state); @@ -79,10 +79,10 @@ public: private: - TaskGoalListManager goal_list_manager; - TaskProximityManager proximity_manager; - TaskInformation *p_task_data[MAXTASKS]{}; - std::vector task_sets[MAXTASKSETS]; + TaskGoalListManager m_goal_list_manager; + TaskProximityManager m_proximity_manager; + TaskInformation *m_task_data[MAXTASKS]{}; + std::vector m_task_sets[MAXTASKSETS]; void SendActiveTaskDescription( Client *client, int task_id, diff --git a/zone/tasks.cpp b/zone/tasks.cpp index c1c4cbceb..4f240bab5 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -12,18 +12,18 @@ extern QueryServ *QServ; void Client::LoadClientTaskState() { - if (RuleB(TaskSystem, EnableTaskSystem) && p_task_manager) { + if (RuleB(TaskSystem, EnableTaskSystem) && task_manager) { if (task_state) { safe_delete(task_state); } task_state = new ClientTaskState; - if (!p_task_manager->LoadClientState(this, task_state)) { + if (!task_manager->LoadClientState(this, task_state)) { safe_delete(task_state); } else { - p_task_manager->SendActiveTasksToClient(this); - p_task_manager->SendCompletedTasksToClient(this, task_state); + task_manager->SendActiveTasksToClient(this); + task_manager->SendCompletedTasksToClient(this, task_state); } } } diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 5540d89ec..76b00398e 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -3100,16 +3100,16 @@ void WorldServer::HandleReloadTasks(ServerPacket *pack) if (rts->Parameter == 0) { Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload ALL tasks"); - safe_delete(p_task_manager); - p_task_manager = new TaskManager; - p_task_manager->LoadTasks(); + safe_delete(task_manager); + task_manager = new TaskManager; + task_manager->LoadTasks(); if (zone) - p_task_manager->LoadProximities(zone->GetZoneID()); + task_manager->LoadProximities(zone->GetZoneID()); entity_list.ReloadAllClientsTaskState(); } else { Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload only task %i", rts->Parameter); - p_task_manager->LoadTasks(rts->Parameter); + task_manager->LoadTasks(rts->Parameter); entity_list.ReloadAllClientsTaskState(rts->Parameter); } @@ -3118,18 +3118,18 @@ void WorldServer::HandleReloadTasks(ServerPacket *pack) case RELOADTASKPROXIMITIES: if (zone) { Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload task proximities"); - p_task_manager->LoadProximities(zone->GetZoneID()); + task_manager->LoadProximities(zone->GetZoneID()); } break; case RELOADTASKGOALLISTS: Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload task goal lists"); - p_task_manager->ReloadGoalLists(); + task_manager->ReloadGoalLists(); break; case RELOADTASKSETS: Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload task sets"); - p_task_manager->LoadTaskSets(); + task_manager->LoadTaskSets(); break; default: diff --git a/zone/zone.cpp b/zone/zone.cpp index f088c6cee..2e29e8eec 100755 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -964,7 +964,7 @@ Zone::Zone(uint32 in_zoneid, uint32 in_instanceid, const char* in_short_name) lootvar = 0; if(RuleB(TaskSystem, EnableTaskSystem)) { - p_task_manager->LoadProximities(zoneid); + task_manager->LoadProximities(zoneid); } short_name = strcpy(new char[strlen(in_short_name)+1], in_short_name); From f429df39a946eca89776cd8cd594a1a9b5d77095 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sun, 7 Feb 2021 15:06:46 -0600 Subject: [PATCH 23/26] Update CMakeLists.txt --- common/CMakeLists.txt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 702f2c867..b2d5eabd0 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -148,6 +148,7 @@ SET(repositories repositories/base/base_character_currency_repository.h repositories/base/base_character_data_repository.h repositories/base/base_character_disciplines_repository.h + repositories/base/base_character_expedition_lockouts_repository.h repositories/base/base_character_inspect_messages_repository.h repositories/base/base_character_item_recast_repository.h repositories/base/base_character_languages_repository.h @@ -166,11 +167,16 @@ SET(repositories repositories/base/base_char_recipe_list_repository.h repositories/base/base_completed_tasks_repository.h repositories/base/base_content_flags_repository.h + repositories/base/base_damageshieldtypes_repository.h repositories/base/base_data_buckets_repository.h repositories/base/base_db_str_repository.h repositories/base/base_discovered_items_repository.h repositories/base/base_doors_repository.h + repositories/base/base_dynamic_zones_repository.h repositories/base/base_eventlog_repository.h + repositories/base/base_expeditions_repository.h + repositories/base/base_expedition_lockouts_repository.h + repositories/base/base_expedition_members_repository.h repositories/base/base_faction_base_data_repository.h repositories/base/base_faction_list_repository.h repositories/base/base_faction_list_mod_repository.h @@ -267,7 +273,6 @@ SET(repositories repositories/base/base_traps_repository.h repositories/base/base_tributes_repository.h repositories/base/base_tribute_levels_repository.h - repositories/base/base_variables_repository.h repositories/base/base_veteran_reward_templates_repository.h repositories/base/base_zone_repository.h repositories/base/base_zone_points_repository.h @@ -306,6 +311,7 @@ SET(repositories repositories/character_currency_repository.h repositories/character_data_repository.h repositories/character_disciplines_repository.h + repositories/character_expedition_lockouts_repository.h repositories/character_inspect_messages_repository.h repositories/character_item_recast_repository.h repositories/character_languages_repository.h @@ -324,11 +330,16 @@ SET(repositories repositories/char_recipe_list_repository.h repositories/completed_tasks_repository.h repositories/content_flags_repository.h + repositories/damageshieldtypes_repository.h repositories/data_buckets_repository.h repositories/db_str_repository.h repositories/discovered_items_repository.h repositories/doors_repository.h + repositories/dynamic_zones_repository.h repositories/eventlog_repository.h + repositories/expeditions_repository.h + repositories/expedition_lockouts_repository.h + repositories/expedition_members_repository.h repositories/faction_base_data_repository.h repositories/faction_list_repository.h repositories/faction_list_mod_repository.h @@ -425,7 +436,6 @@ SET(repositories repositories/traps_repository.h repositories/tributes_repository.h repositories/tribute_levels_repository.h - repositories/variables_repository.h repositories/veteran_reward_templates_repository.h repositories/zone_repository.h repositories/zone_points_repository.h From 01f69bcc514265ddf000bc70c7785d9088ffae90 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sun, 7 Feb 2021 15:22:30 -0600 Subject: [PATCH 24/26] Update task_client_state.cpp --- zone/task_client_state.cpp | 48 ++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp index 0eaf8fc9b..570474c03 100644 --- a/zone/task_client_state.cpp +++ b/zone/task_client_state.cpp @@ -223,7 +223,7 @@ void ClientTaskState::DisableTask(int character_id, int task_count, int *task_li } else { LogTasks( - "[DisableTask] DisableTask called for characterID: [{}] ... but, no tasks exist", + "[DisableTask] DisableTask called for character_id [{}] ... but, no tasks exist", character_id ); } @@ -359,8 +359,8 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & { bool all_activities_complete = true; - TaskInformation *p_task_information = task_manager->m_task_data[task_info.task_id]; - if (p_task_information == nullptr) { + TaskInformation *p_task_data = task_manager->m_task_data[task_info.task_id]; + if (p_task_data == nullptr) { return true; } @@ -371,18 +371,18 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & "character_id [{}] task_id [{}] sequence_mode [{}]", character_id, task_info.task_id, - p_task_information->sequence_mode + p_task_data->sequence_mode ); - if (p_task_information->sequence_mode == ActivitiesSequential) { + if (p_task_data->sequence_mode == ActivitiesSequential) { if (task_info.activity[0].activity_state != ActivityCompleted) { task_info.activity[0].activity_state = ActivityActive; } // Enable the next Hidden task. - for (int i = 0; i < p_task_information->activity_count; i++) { + for (int i = 0; i < p_task_data->activity_count; i++) { if ((task_info.activity[i].activity_state == ActivityActive) && - (!p_task_information->activity_information[i].optional)) { + (!p_task_data->activity_information[i].optional)) { all_activities_complete = false; break; } @@ -422,9 +422,8 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & completed_task_information.task_id = task_info.task_id; completed_task_information.completed_time = time(nullptr); - for (int i = 0; i < p_task_information->activity_count; i++) { - completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == - ActivityCompleted); + for (int i = 0; i < p_task_data->activity_count; i++) { + completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == ActivityCompleted); } m_completed_tasks.push_back(completed_task_information); @@ -443,16 +442,16 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & LogTasks( "[UnlockActivities] Current step [{}] last_step [{}]", task_info.current_step, - p_task_information->last_step + p_task_data->last_step ); // If current_step is -1, this is the first call to this method since loading the // client state. Unlock all activities with a step number of 0 if (task_info.current_step == -1) { - for (int i = 0; i < p_task_information->activity_count; i++) { + for (int i = 0; i < p_task_data->activity_count; i++) { - if (p_task_information->activity_information[i].step_number == 0 && + if (p_task_data->activity_information[i].step_number == 0 && task_info.activity[i].activity_state == ActivityHidden) { task_info.activity[i].activity_state = ActivityActive; // task_info.activity_information[i].updated=true; @@ -461,11 +460,11 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & task_info.current_step = 0; } - for (int current_step = task_info.current_step; current_step <= p_task_information->last_step; current_step++) { - for (int activity = 0; activity < p_task_information->activity_count; activity++) { - if (p_task_information->activity_information[activity].step_number == (int) task_info.current_step) { + for (int current_step = task_info.current_step; current_step <= p_task_data->last_step; current_step++) { + for (int activity = 0; activity < p_task_data->activity_count; activity++) { + if (p_task_data->activity_information[activity].step_number == (int) task_info.current_step) { if ((task_info.activity[activity].activity_state != ActivityCompleted) && - (!p_task_information->activity_information[activity].optional)) { + (!p_task_data->activity_information[activity].optional)) { current_step_complete = false; all_activities_complete = false; break; @@ -510,7 +509,7 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & completed_task_information.task_id = task_info.task_id; completed_task_information.completed_time = time(nullptr); - for (int activity_id = 0; activity_id < p_task_information->activity_count; activity_id++) { + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { completed_task_information.activity_done[activity_id] = (task_info.activity[activity_id].activity_state == ActivityCompleted); } @@ -521,8 +520,8 @@ bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation & } // Mark all non-completed tasks in the current step as active - for (int activity = 0; activity < p_task_information->activity_count; activity++) { - if ((p_task_information->activity_information[activity].step_number == (int) task_info.current_step) && + for (int activity = 0; activity < p_task_data->activity_count; activity++) { + if ((p_task_data->activity_information[activity].step_number == (int) task_info.current_step) && (task_info.activity[activity].activity_state == ActivityHidden)) { task_info.activity[activity].activity_state = ActivityActive; task_info.activity[activity].updated = true; @@ -559,7 +558,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np continue; } - // Check if there are any active kill activities for this p_task_information + // Check if there are any active kill activities for this p_task_data auto p_task_data = task_manager->m_task_data[current_task->task_id]; if (p_task_data == nullptr) { return false; @@ -610,7 +609,7 @@ bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int np // If METHODQUEST, don't updated the activity_information here continue; } - // We found an active p_task_information to kill this type of NPC, so increment the done count + // We found an active p_task_data to kill this type of NPC, so increment the done count LogTasksDetail("Calling increment done count ByNPC"); IncrementDoneCount(client, p_task_data, current_task->slot, activity_id); is_updating = true; @@ -1162,7 +1161,10 @@ void ClientTaskState::IncrementDoneCount( else { // Send an updated packet for this single activity_information task_manager->SendTaskActivityLong( - client, info->task_id, activity_id, task_index, + client, + info->task_id, + activity_id, + task_index, task_information->activity_information[activity_id].optional ); task_manager->SaveClientState(client, this); From 00902d8a7e0474c864b570804803e70a39c54909 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sun, 7 Feb 2021 15:44:25 -0600 Subject: [PATCH 25/26] Private member prefixes for proximities and goal lists --- zone/task_goal_list_manager.cpp | 54 ++++++++++++++++----------------- zone/task_goal_list_manager.h | 4 +-- zone/task_proximity_manager.cpp | 6 ++-- zone/task_proximity_manager.h | 2 +- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/zone/task_goal_list_manager.cpp b/zone/task_goal_list_manager.cpp index b53e87499..9a641c6eb 100644 --- a/zone/task_goal_list_manager.cpp +++ b/zone/task_goal_list_manager.cpp @@ -11,15 +11,15 @@ TaskGoalListManager::TaskGoalListManager() { - goal_lists_count = 0; + m_goal_lists_count = 0; } TaskGoalListManager::~TaskGoalListManager() {} bool TaskGoalListManager::LoadLists() { - task_goal_lists.clear(); - goal_lists_count = 0; + m_task_goal_lists.clear(); + m_goal_lists_count = 0; std::string query = "SELECT `listid`, COUNT(`entry`) FROM `goallists` GROUP by `listid` ORDER BY `listid`"; auto results = content_db.QueryDatabase(query); @@ -27,39 +27,39 @@ bool TaskGoalListManager::LoadLists() return false; } - goal_lists_count = results.RowCount(); - LogTasks("Loaded [{}] GoalLists", goal_lists_count); + m_goal_lists_count = results.RowCount(); + LogTasks("Loaded [{}] GoalLists", m_goal_lists_count); - task_goal_lists.reserve(goal_lists_count); + m_task_goal_lists.reserve(m_goal_lists_count); int list_index = 0; for (auto row = results.begin(); row != results.end(); ++row) { int list_id = atoi(row[0]); int list_size = atoi(row[1]); - task_goal_lists.push_back({list_id, 0, 0}); + m_task_goal_lists.push_back({list_id, 0, 0}); - task_goal_lists[list_index].GoalItemEntries.reserve(list_size); + m_task_goal_lists[list_index].GoalItemEntries.reserve(list_size); list_index++; } auto goal_lists = GoallistsRepository::GetWhere(content_db, "TRUE ORDER BY listid, entry ASC"); - for (list_index = 0; list_index < goal_lists_count; list_index++) { + for (list_index = 0; list_index < m_goal_lists_count; list_index++) { - int list_id = task_goal_lists[list_index].ListID; + int list_id = m_task_goal_lists[list_index].ListID; for (auto &entry: goal_lists) { if (entry.listid == list_id) { - if (entry.entry < task_goal_lists[list_index].Min) { - task_goal_lists[list_index].Min = entry.entry; + if (entry.entry < m_task_goal_lists[list_index].Min) { + m_task_goal_lists[list_index].Min = entry.entry; } - if (entry.entry > task_goal_lists[list_index].Max) { - task_goal_lists[list_index].Max = entry.entry; + if (entry.entry > m_task_goal_lists[list_index].Max) { + m_task_goal_lists[list_index].Max = entry.entry; } - task_goal_lists[list_index].GoalItemEntries.push_back(entry.entry); + m_task_goal_lists[list_index].GoalItemEntries.push_back(entry.entry); LogTasksDetail( "Goal list index [{}] loading list [{}] entry [{}]", @@ -80,31 +80,31 @@ int TaskGoalListManager::GetListByID(int list_id) // Find the list with the specified ListID and return the index auto it = std::find_if( - task_goal_lists.begin(), - task_goal_lists.end(), + m_task_goal_lists.begin(), + m_task_goal_lists.end(), [list_id](const TaskGoalList_Struct &t) { return t.ListID == list_id; } ); - if (it == task_goal_lists.end()) { + if (it == m_task_goal_lists.end()) { return -1; } - return std::distance(task_goal_lists.begin(), it); + return std::distance(m_task_goal_lists.begin(), it); } int TaskGoalListManager::GetFirstEntry(int list_id) { int list_by_id = GetListByID(list_id); - if ((list_by_id < 0) || (list_by_id >= goal_lists_count)) { + if ((list_by_id < 0) || (list_by_id >= m_goal_lists_count)) { return -1; } - if (task_goal_lists[list_by_id].GoalItemEntries.empty()) { + if (m_task_goal_lists[list_by_id].GoalItemEntries.empty()) { return -1; } - return task_goal_lists[list_by_id].GoalItemEntries[0]; + return m_task_goal_lists[list_by_id].GoalItemEntries[0]; } std::vector TaskGoalListManager::GetListContents(int list_index) @@ -112,11 +112,11 @@ std::vector TaskGoalListManager::GetListContents(int list_index) std::vector list_contents; int list_by_id = GetListByID(list_index); - if ((list_by_id < 0) || (list_by_id >= goal_lists_count)) { + if ((list_by_id < 0) || (list_by_id >= m_goal_lists_count)) { return list_contents; } - list_contents = task_goal_lists[list_by_id].GoalItemEntries; + list_contents = m_task_goal_lists[list_by_id].GoalItemEntries; return list_contents; } @@ -127,16 +127,16 @@ bool TaskGoalListManager::IsInList(int list_id, int entry) int list_index = GetListByID(list_id); - if ((list_index < 0) || (list_index >= goal_lists_count)) { + if ((list_index < 0) || (list_index >= m_goal_lists_count)) { return false; } - if ((entry < task_goal_lists[list_index].Min) || (entry > task_goal_lists[list_index].Max)) { + if ((entry < m_task_goal_lists[list_index].Min) || (entry > m_task_goal_lists[list_index].Max)) { return false; } int first_entry = 0; - auto &task = task_goal_lists[list_index]; + auto &task = m_task_goal_lists[list_index]; auto it = std::find(task.GoalItemEntries.begin(), task.GoalItemEntries.end(), entry); if (it == task.GoalItemEntries.end()) { diff --git a/zone/task_goal_list_manager.h b/zone/task_goal_list_manager.h index b518599e4..11146f6e3 100644 --- a/zone/task_goal_list_manager.h +++ b/zone/task_goal_list_manager.h @@ -29,8 +29,8 @@ public: std::vector GetListContents(int list_index); private: - std::vector task_goal_lists; - int goal_lists_count; + std::vector m_task_goal_lists; + int m_goal_lists_count; }; diff --git a/zone/task_proximity_manager.cpp b/zone/task_proximity_manager.cpp index 615794c38..ee46acbcb 100644 --- a/zone/task_proximity_manager.cpp +++ b/zone/task_proximity_manager.cpp @@ -23,7 +23,7 @@ TaskProximityManager::~TaskProximityManager() bool TaskProximityManager::LoadProximities(int zone_id) { TaskProximity proximity{}; - task_proximities.clear(); + m_task_proximities.clear(); auto proximities = ProximitiesRepository::GetWhere( content_db, @@ -39,7 +39,7 @@ bool TaskProximityManager::LoadProximities(int zone_id) proximity.min_z = row.minz; proximity.max_z = row.maxz; - task_proximities.push_back(proximity); + m_task_proximities.push_back(proximity); } LogTasks("Loaded [{}] Task Proximities", proximities.size()); @@ -49,7 +49,7 @@ bool TaskProximityManager::LoadProximities(int zone_id) int TaskProximityManager::CheckProximities(float x, float y, float z) { - for (auto &task_proximity : task_proximities) { + for (auto &task_proximity : m_task_proximities) { TaskProximity *p_proximity = &task_proximity; diff --git a/zone/task_proximity_manager.h b/zone/task_proximity_manager.h index e6f42e374..a3fe44c07 100644 --- a/zone/task_proximity_manager.h +++ b/zone/task_proximity_manager.h @@ -21,7 +21,7 @@ public: int CheckProximities(float x, float y, float z); private: - std::vector task_proximities; + std::vector m_task_proximities; }; #endif //EQEMU_TASK_PROXIMITY_MANAGER_H From 9f5ce8e3c91243fb6215c94e237d4b3e7893210a Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sun, 7 Feb 2021 17:08:16 -0600 Subject: [PATCH 26/26] PR comments --- zone/task_client_state.cpp | 2 +- zone/task_manager.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp index 570474c03..3ded9eb27 100644 --- a/zone/task_client_state.cpp +++ b/zone/task_client_state.cpp @@ -1402,7 +1402,7 @@ bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) } LogTasks( - "[IsTaskActivityActive] (Update) task_id [{}] activity_id [{}] activity_state", + "[IsTaskActivityActive] (Update) task_id [{}] activity_id [{}] activity_state [{}]", task_id, activity_id, info->activity[activity_id].activity_state diff --git a/zone/task_manager.cpp b/zone/task_manager.cpp index d55d5b980..7ba251840 100644 --- a/zone/task_manager.cpp +++ b/zone/task_manager.cpp @@ -162,7 +162,7 @@ bool TaskManager::LoadTasks(int single_task) // This shouldn't happen, as the SELECT is bounded by MAXTASKS LogTasks( - "Error: Task or activity_information ID ([{}], [{}]) out of range while loading activities from database", + "[LoadTasks] Error: Task or activity_information ID ([{}], [{}]) out of range while loading activities from database", task_id, activity_id ); @@ -171,7 +171,7 @@ bool TaskManager::LoadTasks(int single_task) if (m_task_data[task_id] == nullptr) { LogTasks( - "Error: activity_information for non-existent task ([{}], [{}]) while loading activities from database", + "[LoadTasks] Error: activity_information for non-existent task ([{}], [{}]) while loading activities from database", task_id, activity_id ); @@ -193,8 +193,8 @@ bool TaskManager::LoadTasks(int single_task) // ERR_NOTASK errors. // Change to (activityID != (Tasks[taskID]->activity_count + 1)) to index from 1 if (activity_id != m_task_data[task_id]->activity_count) { - LogError( - "[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", + LogTasks( + "[LoadTasks] Error: Activities for Task [{}] (activity_id [{}]) are not sequential starting at 0. Not loading task ", task_id, activity_id );