From bd96d676bee877ff0d588034a2960bb30263e765 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sat, 8 Jun 2019 23:43:36 -0400 Subject: [PATCH] Work on getting tasks sent to other members Some stuff just stubbed out for now --- zone/client.h | 1 + zone/tasks.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++ zone/tasks.h | 4 +++- zone/worldserver.cpp | 11 +++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/zone/client.h b/zone/client.h index 158f03d54..276fa04b0 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1027,6 +1027,7 @@ public: 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 void AssignSharedTask(int TaskID, int NPCID, int id, int accepted_time, std::vector &members) { if (taskstate) taskstate->AcceptNewSharedTask(this, TaskID, NPCID, id, accepted_time, members); } + inline void AddToSharedTask(int TaskID) { if (taskstate) taskstate->AddToSharedTask(this, TaskID); } 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); } diff --git a/zone/tasks.cpp b/zone/tasks.cpp index 4023998f4..800df9774 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -3074,6 +3074,21 @@ void TaskManager::SendActiveTaskDescription(Client *c, int TaskID, ClientTaskInf safe_delete(outapp); } +// TODO: stub +SharedTaskState *TaskManager::LoadSharedTask(int id) +{ + return nullptr; +} + +SharedTaskState *TaskManager::GetSharedTask(int id) +{ + auto it = SharedTasks.find(id); + if (it == SharedTasks.end()) + return nullptr; + + return &(it->second); +} + bool ClientTaskState::IsTaskActivityCompleted(TaskType type, int index, int ActivityID) { switch (type) { @@ -3546,6 +3561,38 @@ void ClientTaskState::AcceptNewSharedTask(Client *c, int TaskID, int NPCID, int // there are a few issues we need to solve with this } +/* + * This function is called when world sends ServerOP_TaskZoneCreated to trigger + * members to join. If the task doesn't already exist, we need to load it from + * the DB. + * + * This is also called in LoadClientTaskState() when they notice they have a + * shared task they need to join. (Called from first OP_ZoneEntry) + */ +void ClientTaskState::AddToSharedTask(Client *c, int TaskID) +{ + auto task = taskmanager->GetSharedTask(TaskID); + if (!task) + task = taskmanager->LoadSharedTask(TaskID); + + if (!task) {// FUCK + return; + } + + task->MemberEnterZone(c); + + // send packets + auto task_activity = task->GetActivity(); + taskmanager->SendSingleActiveTaskToClient(c, *task_activity, false, true); + task->SendMembersList(c); + + // So normally getting a task we would send EVENT_TASK_ACCEPTED here, but + // this isn't an accept step. I guess we should add another event in case + // they need the same thing TODO + + return; +} + void ClientTaskState::ProcessTaskProximities(Client *c, float X, float Y, float Z) { float LastX = c->ProximityX(); diff --git a/zone/tasks.h b/zone/tasks.h index 2bad493f1..997a36c8a 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -180,6 +180,7 @@ public: bool HasSlotForTask(TaskInformation *task); // shared task related functions void AcceptNewSharedTask(Client *c, int TaskID, int NPCID, int id, int accepted_time, std::vector &members); + void AddToSharedTask(Client *c, int TaskID); void RequestSharedTask(Client *c, int TaskID, int NPCID, bool enforce_level_requirement = false); inline bool HasFreeTaskSlot() { return ActiveTask.TaskID == TASKSLOTEMPTY; } @@ -267,8 +268,9 @@ public: bool IsTaskRepeatable(int TaskID); friend class ClientTaskState; - void LoadSharedTask(int id); // loads the shared task state + SharedTaskState *LoadSharedTask(int id); // loads the shared task state SharedTaskState *CreateSharedTask(int id, int task_id); + SharedTaskState *GetSharedTask(int id); private: TaskGoalListManager GoalListManager; diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 3cd70f078..0f8c77d95 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -1981,6 +1981,17 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } break; } + case ServerOP_TaskZoneCreated: + { + int task_id = pack->ReadUInt32(); + char name[64] = { 0 }; + pack->ReadString(name); + + auto client = entity_list.GetClientByName(name); + if (client) + client->AddToSharedTask(task_id); + break; + } default: { std::cout << " Unknown ZSopcode:" << (int)pack->opcode; std::cout << " size:" << pack->size << std::endl;