diff --git a/zone/client.h b/zone/client.h index b216a0e38..f958b20d5 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1019,6 +1019,7 @@ public: 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); } diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 490d3b1f8..ab7a95f24 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -2149,7 +2149,7 @@ 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) - taskmanager->SendTaskSelector(initiator, owner, taskcount, tasks); + initiator->TaskQuestSetSelector(owner, taskcount, tasks); } void QuestManager::enabletask(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 98d8de5e1..b14a2b162 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -941,8 +941,6 @@ int TaskManager::GetTaskMaxLevel(int TaskID) void TaskManager::TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, int TaskSetID) { - unsigned int EnabledTaskIndex = 0; - unsigned int TaskSetIndex = 0; int TaskList[MAXCHOOSERENTRIES]; int TaskListIndex = 0; int PlayerLevel = c->GetLevel(); @@ -992,6 +990,38 @@ void TaskManager::TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, i return; } +// 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(); + + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskQuestSetSelector called for array size %d", 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 (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 (TaskListIndex > 0) { + SendTaskSelector(c, mob, TaskListIndex, TaskList); + } else { + c->Message_StringID(15, MAX_ACTIVE_TASKS, c->GetName()); // check color, I think this might be only for (Shared) Tasks, w/e + } + + return; +} + void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *TaskList) { if (c->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) diff --git a/zone/tasks.h b/zone/tasks.h index 03cc8f8e1..8db0c4ef8 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -261,6 +261,7 @@ public: int GetTaskMinLevel(int TaskID); int GetTaskMaxLevel(int TaskID); 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, int TaskIndex, bool TaskComplete, bool BringUpTaskJournal=false); void SendTaskActivityShort(Client *c, int TaskID, int ActivityID, int ClientTaskIndex);