F4MP/codigos originales/tiltedcode/Code/server/Services/PartyService.h
2026-01-06 18:53:59 +01:00

72 lines
2.5 KiB
C++

#pragma once
#include <Events/PacketEvent.h>
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<Player*> 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<PartyInviteRequest>& acPacket) noexcept;
void OnPartyAcceptInvite(const PacketEvent<PartyAcceptInviteRequest>& acPacket) noexcept;
void OnPartyLeave(const PacketEvent<PartyLeaveRequest>& acPacket) noexcept;
void OnPartyCreate(const PacketEvent<PartyCreateRequest>& acPacket) noexcept;
void OnPartyChangeLeader(const PacketEvent<PartyChangeLeaderRequest>& acPacket) noexcept;
void OnPartyKick(const PacketEvent<PartyKickRequest>& 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<uint32_t, Party> 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;
};