mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 16:51:29 +00:00
181 lines
5.5 KiB
C++
181 lines
5.5 KiB
C++
#include "shared_task_zone_messaging.h"
|
|
#include "../common/shared_tasks.h"
|
|
#include "../common/servertalk.h"
|
|
#include "client.h"
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
void SharedTaskZoneMessaging::HandleWorldMessage(ServerPacket *pack)
|
|
{
|
|
switch (pack->opcode) {
|
|
case ServerOP_SharedTaskAcceptNewTask: {
|
|
auto p = reinterpret_cast<ServerSharedTaskRequest_Struct *>(pack->pBuffer);
|
|
auto c = entity_list.GetClientByCharID(p->requested_character_id);
|
|
if (c) {
|
|
LogTasks("[ServerOP_SharedTaskAcceptNewTask] We're back in zone and I found [{}]", c->GetCleanName());
|
|
|
|
c->m_requesting_shared_task = true;
|
|
c->GetTaskState()
|
|
->AcceptNewTask(
|
|
c,
|
|
(int) p->requested_task_id,
|
|
(int) p->requested_npc_type_id,
|
|
p->accept_time
|
|
);
|
|
c->LoadClientTaskState();
|
|
c->m_requesting_shared_task = false;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case ServerOP_SharedTaskUpdate: {
|
|
auto p = reinterpret_cast<ServerSharedTaskActivityUpdate_Struct *>(pack->pBuffer);
|
|
auto c = entity_list.GetClientByCharID(p->source_character_id);
|
|
if (c) {
|
|
LogTasks("[ServerOP_SharedTaskUpdate] We're back in zone and I found [{}]", c->GetCleanName());
|
|
|
|
c->m_shared_task_update = true;
|
|
c->GetTaskState()->SharedTaskIncrementDoneCount(
|
|
c,
|
|
(int) p->task_id,
|
|
(int) p->activity_id,
|
|
(int) p->done_count,
|
|
p->ignore_quest_update
|
|
);
|
|
c->m_shared_task_update = false;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case ServerOP_SharedTaskQuit: {
|
|
auto p = reinterpret_cast<ServerSharedTaskQuit_Struct *>(pack->pBuffer);
|
|
auto c = entity_list.GetClientByCharID(p->requested_character_id);
|
|
if (c) {
|
|
LogTasks("[ServerOP_SharedTaskQuit] We're back in zone and I found [{}]", c->GetCleanName());
|
|
|
|
c->m_requested_shared_task_removal = true;
|
|
c->GetTaskState()->CancelTask(
|
|
c,
|
|
TASKSLOTSHAREDTASK,
|
|
static_cast<TaskType>((int) TASK_TYPE_SHARED),
|
|
p->remove_from_db
|
|
);
|
|
c->m_requested_shared_task_removal = false;
|
|
|
|
c->SetSharedTaskId(0);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case ServerOP_SharedTaskMemberlist: {
|
|
auto p = reinterpret_cast<ServerSharedTaskMemberListPacket_Struct *>(pack->pBuffer);
|
|
|
|
LogTasks(
|
|
"[ServerOP_SharedTaskMemberlist] We're back in zone and I'm searching for [{}]",
|
|
p->destination_character_id
|
|
);
|
|
|
|
// find character and route packet
|
|
auto c = entity_list.GetClientByCharID(p->destination_character_id);
|
|
if (c) {
|
|
LogTasks("[ServerOP_SharedTaskMemberlist] We're back in zone and I found [{}]", c->GetCleanName());
|
|
|
|
std::vector<SharedTaskMember> members;
|
|
|
|
// deserialize members from world
|
|
EQ::Util::MemoryStreamReader ss(p->cereal_serialized_members, p->cereal_size);
|
|
cereal::BinaryInputArchive archive(ss);
|
|
archive(members);
|
|
|
|
SerializeBuffer buf(sizeof(SharedTaskMemberList_Struct) + 15 * members.size());
|
|
buf.WriteInt32(0); // unknown ids
|
|
buf.WriteInt32(0);
|
|
buf.WriteInt32((int32) members.size());
|
|
|
|
for (auto &m : members) {
|
|
buf.WriteString(m.character_name);
|
|
buf.WriteInt32(0); // monster mission
|
|
buf.WriteInt8(m.is_leader ? 1 : 0);
|
|
}
|
|
|
|
auto outapp = std::make_unique<EQApplicationPacket>(OP_SharedTaskMemberList, buf);
|
|
c->QueuePacket(outapp.get());
|
|
}
|
|
|
|
break;
|
|
}
|
|
case ServerOP_SharedTaskMemberChange: {
|
|
auto p = reinterpret_cast<ServerSharedTaskMemberChangePacket_Struct *>(pack->pBuffer);
|
|
|
|
LogTasksDetail("[ServerOP_SharedTaskMemberChange] Searching for [{}]", p->destination_character_id);
|
|
|
|
auto c = entity_list.GetClientByCharID(p->destination_character_id);
|
|
if (c) {
|
|
LogTasksDetail("[ServerOP_SharedTaskMemberChange] Found [{}]", c->GetCleanName());
|
|
|
|
SerializeBuffer buf;
|
|
buf.WriteInt32(0); // unique character id of receiver, leave 0 for emu
|
|
buf.WriteInt32(0); // unknown, seen 50, 4, 0
|
|
buf.WriteInt8(p->removed ? 0 : 1); // 0: removed 1: added
|
|
buf.WriteString(p->player_name);
|
|
|
|
// live sends more after the name but it might just be garbage from
|
|
// a re-used buffer (possibly a former name[64] buffer?)
|
|
|
|
auto outapp = std::make_unique<EQApplicationPacket>(OP_SharedTaskMemberChange, buf);
|
|
c->QueuePacket(outapp.get());
|
|
}
|
|
|
|
break;
|
|
}
|
|
case ServerOP_SharedTaskInvitePlayer: {
|
|
auto p = reinterpret_cast<ServerSharedTaskInvitePlayer_Struct *>(pack->pBuffer);
|
|
auto c = entity_list.GetClientByCharID(p->requested_character_id);
|
|
if (c) {
|
|
LogTasks("[ServerOP_SharedTaskInvitePlayer] We're back in zone and I found [{}]", c->GetCleanName());
|
|
|
|
// init packet
|
|
auto outapp = new EQApplicationPacket(OP_SharedTaskInvite, sizeof(SharedTaskInvite_Struct));
|
|
auto *i = (SharedTaskInvite_Struct *) outapp->pBuffer;
|
|
|
|
// fill
|
|
i->unknown00 = 0;
|
|
i->invite_id = (int) p->invite_shared_task_id;
|
|
strn0cpy(i->inviter_name, p->inviter_name, 64);
|
|
strn0cpy(i->task_name, p->task_name, 64);
|
|
|
|
// sends
|
|
c->QueuePacket(outapp);
|
|
safe_delete(outapp);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case ServerOP_SharedTaskPurgeAllCommand: {
|
|
LogTasksDetail("[ServerOP_SharedTaskPurgeAllCommand] Syncing clients");
|
|
|
|
for (auto &client: entity_list.GetClientList()) {
|
|
Client *c = client.second;
|
|
task_manager->SyncClientSharedTaskState(c, c->GetTaskState());
|
|
c->RemoveClientTaskState();
|
|
c->LoadClientTaskState();
|
|
}
|
|
|
|
break;
|
|
}
|
|
case ServerOP_SharedTaskFailed: {
|
|
auto buf = reinterpret_cast<ServerSharedTaskCharacterTask_Struct*>(pack->pBuffer);
|
|
Client* client = entity_list.GetClientByCharID(buf->character_id);
|
|
if (client)
|
|
{
|
|
client->SendTaskFailed(buf->task_id, TASKSLOTSHAREDTASK, TaskType::Shared);
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
}
|