#ifndef EQEMU_SHARED_TASKS_H #define EQEMU_SHARED_TASKS_H #include "database.h" #include "timer.h" #include "tasks.h" #include "types.h" #include "repositories/character_data_repository.h" #include "repositories/tasks_repository.h" #include "repositories/task_activities_repository.h" #include "repositories/shared_tasks_repository.h" #include #include #include // ops #define ServerOP_SharedTaskRequest 0x0300 // zone -> world. Player trying to get task. Relayed world -> zone on confirmation #define ServerOP_SharedTaskAddPlayer 0x0301 // bidirectional. /taskaddplayer request zone -> world. success world -> zone #define ServerOP_SharedTaskMakeLeader 0x0302 // zone -> world -> zone #define ServerOP_SharedTaskRemovePlayer 0x0303 // zone -> world -> zone #define ServerOP_SharedTaskQuit 0x0304 // zone -> world. Player trying to delete task #define ServerOP_SharedTaskUpdate 0x0305 // zone -> world. Client sending task update to world. Relayed world -> zone on confirmation #define ServerOP_SharedTaskMemberlist 0x0306 // world -> zone. Send shared task memberlist #define ServerOP_SharedTaskRequestMemberlist 0x0307 // zone -> world. Send shared task memberlist (zone in initial for now, could change) #define ServerOP_SharedTaskAcceptNewTask 0x0308 // world -> zone. World verified, continue AcceptNewTask #define ServerOP_SharedTaskInvitePlayer 0x0309 // world -> zone. Sends task invite to player #define ServerOP_SharedTaskInviteAcceptedPlayer 0x0310 // zone -> world. Confirming task invite #define ServerOP_SharedTaskCreateDynamicZone 0x0311 // zone -> world #define ServerOP_SharedTaskPurgeAllCommand 0x0312 // zone -> world #define ServerOP_SharedTaskPlayerList 0x0313 // zone -> world /taskplayerlist command #define ServerOP_SharedTaskMemberChange 0x0314 // world -> zone. Send shared task single member added/removed (client also handles message) #define ServerOP_SharedTaskKickPlayers 0x0315 // zone -> world /kickplayers task #define ServerOP_SharedTaskLock 0x0316 // zone -> world enum class SharedTaskRequestGroupType { Solo = 0, Group, Raid }; // used in // ServerOP_SharedTaskRequest // ServerOP_SharedTaskAcceptNewTask struct ServerSharedTaskRequest_Struct { uint32 requested_character_id; uint32 requested_task_id; uint32 requested_npc_type_id; // original task logic passthrough uint32 accept_time; }; // ServerOP_SharedTaskInvitePlayer struct ServerSharedTaskInvitePlayer_Struct { uint32 requested_character_id; uint32 invite_shared_task_id; char task_name[64]; char inviter_name[64]; }; // ServerOP_SharedTaskQuit // gets re-used when sent back to clients struct ServerSharedTaskQuit_Struct { uint32 requested_character_id; uint32 task_id; bool remove_from_db; }; // used in the shared task request process (currently) struct SharedTaskMember { uint32 character_id = 0; std::string character_name; bool is_leader = false; template void serialize(Archive& archive) { archive(character_id, character_name, is_leader); } }; // used in shared task requests to validate group/raid members struct SharedTaskRequest { int lowest_level; int highest_level; uint32_t leader_id; SharedTaskRequestGroupType group_type; std::vector character_ids; std::vector members; }; // ServerOP_SharedTaskMemberlist // builds the buffer and sends to clients directly struct ServerSharedTaskMemberListPacket_Struct { uint32 destination_character_id; uint32 cereal_size; char cereal_serialized_members[0]; // serialized member list using cereal }; struct ServerSharedTaskMemberChangePacket_Struct { uint32 destination_character_id; uint32 shared_task_id; bool removed; char player_name[64]; }; struct SharedTaskActivityStateEntry { uint32 activity_id; uint32 done_count; uint32 max_done_count; // goalcount uint32 updated_time; uint32 completed_time; int req_activity_id; int step; bool optional; ActivityState activity_state; // world only uses Hidden and Completed states }; struct ServerSharedTaskActivityUpdate_Struct { uint32 source_character_id; uint32 task_id; uint32 activity_id; uint32 done_count; bool ignore_quest_update; }; struct ServerSharedTaskRequestMemberlist_Struct { uint32 source_character_id; uint32 task_id; }; struct ServerSharedTaskRemovePlayer_Struct { uint32 source_character_id; uint32 task_id; char player_name[64]; }; struct ServerSharedTaskAddPlayer_Struct { uint32 source_character_id; uint32 task_id; char player_name[64]; }; struct ServerSharedTaskMakeLeader_Struct { uint32 source_character_id; uint32 task_id; char player_name[64]; }; struct ServerSharedTaskInviteAccepted_Struct { uint32 source_character_id; uint32 shared_task_id; bool accepted; char player_name[64]; }; struct ServerSharedTaskCreateDynamicZone_Struct { uint32 source_character_id; uint32 task_id; uint32 cereal_size; char cereal_data[0]; // serialized dz with creation parameters }; struct ServerSharedTaskPlayerList_Struct { uint32 source_character_id; uint32 task_id; }; struct ServerSharedTaskKickPlayers_Struct { uint32 source_character_id; uint32 task_id; }; struct ServerSharedTaskLock_Struct { uint32 source_character_id; uint32 task_id; bool lock; }; class SharedTask { public: // used in both zone and world validation static SharedTaskRequest GetRequestCharacters(Database& db, uint32_t requested_character_id); void AddCharacterToMemberHistory(uint32_t character_id); SharedTaskMember FindMemberFromCharacterID(uint32_t character_id) const; SharedTaskMember FindMemberFromCharacterName(const std::string& character_name) const; SharedTaskMember GetLeader() const; std::vector GetActivityState() const; const std::vector& GetMembers() const; // getters const std::vector &GetTaskActivityData() const; const TasksRepository::Tasks &GetTaskData() const; // setters void SetMembers(const std::vector &members); void SetSharedTaskActivityState(const std::vector &activity_state); void SetTaskActivityData(const std::vector &task_activity_data); void SetTaskData(const TasksRepository::Tasks &task_data); // active record of database shared task const SharedTasksRepository::SharedTasks &GetDbSharedTask() const; void SetDbSharedTask(const SharedTasksRepository::SharedTasks &m_db_shared_task); std::vector m_shared_task_activity_state; std::vector m_members; std::vector member_id_history; // past and present members for replay timers std::vector dynamic_zone_ids; Timer terminate_timer; protected: SharedTasksRepository::SharedTasks m_db_shared_task; // reference to task data (only for this shared task) TasksRepository::Tasks m_task_data; std::vector m_task_activity_data; }; #endif //EQEMU_SHARED_TASKS_H