#pragma once #include struct World; struct UpdateEvent; struct PlayerJoinEvent; struct PlayerLeaveEvent; struct PartyInviteRequest; struct PartyAcceptInviteRequest; struct PartyLeaveRequest; struct NotifyPartyInfo; struct PartyCreateRequest; struct PartyChangeLeaderRequest; struct PartyKickRequest; /** * @brief Manages every party in the server. */ struct PartyService { struct Party { uint32_t LeaderPlayerId; Vector Members; GameId CachedWeather{}; }; PartyService(World& aWorld, entt::dispatcher& aDispatcher) noexcept; ~PartyService() noexcept = default; TP_NOCOPYMOVE(PartyService); const Party* GetById(uint32_t aId) const noexcept; bool IsPlayerInParty(Player* const apPlayer) const noexcept; bool IsPlayerLeader(Player* const apPlayer) noexcept; Party* GetPlayerParty(Player* const apPlayer) noexcept; protected: void OnUpdate(const UpdateEvent& acEvent) noexcept; void OnPlayerJoin(const PlayerJoinEvent& acEvent) noexcept; void OnPlayerLeave(const PlayerLeaveEvent& acEvent) noexcept; void OnPartyInvite(const PacketEvent& acPacket) noexcept; void OnPartyAcceptInvite(const PacketEvent& acPacket) noexcept; void OnPartyLeave(const PacketEvent& acPacket) noexcept; void OnPartyCreate(const PacketEvent& acPacket) noexcept; void OnPartyChangeLeader(const PacketEvent& acPacket) noexcept; void OnPartyKick(const PacketEvent& acPacket) noexcept; void RemovePlayerFromParty(Player* apPlayer) noexcept; void BroadcastPlayerList(Player* apPlayer = nullptr) const noexcept; void BroadcastPartyInfo(uint32_t aPartyId) const noexcept; private: World& m_world; TiltedPhoques::Map m_parties; uint32_t m_nextId{0}; uint64_t m_nextInvitationExpire{0}; entt::scoped_connection m_updateEvent; entt::scoped_connection m_playerJoinConnection; entt::scoped_connection m_playerLeaveConnection; entt::scoped_connection m_partyInviteConnection; entt::scoped_connection m_partyAcceptInviteConnection; entt::scoped_connection m_partyLeaveConnection; entt::scoped_connection m_partyCreateConnection; entt::scoped_connection m_partyChangeLeaderConnection; entt::scoped_connection m_partyKickConnection; void SendPartyJoinedEvent(Party& aParty, Player* aPlayer) noexcept; };