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

88 lines
2.9 KiB
C++

#pragma once
struct World;
struct TransportService;
struct UpdateEvent;
struct ConnectedEvent;
struct DisconnectedEvent;
struct ServerSettings;
struct GridCellChangeEvent;
struct CellChangeEvent;
struct PlayerDialogueEvent;
struct PlayerLevelEvent;
struct PartyJoinedEvent;
struct PartyLeftEvent;
struct NotifyPlayerRespawn;
/**
* @brief Handles logic related to the local player.
*/
struct PlayerService
{
PlayerService(World& aWorld, entt::dispatcher& aDispatcher, TransportService& aTransport) noexcept;
~PlayerService() noexcept = default;
TP_NOCOPYMOVE(PlayerService);
protected:
void OnUpdate(const UpdateEvent& acEvent) noexcept;
void OnConnected(const ConnectedEvent& acEvent) noexcept;
void OnDisconnected(const DisconnectedEvent& acEvent) noexcept;
void OnServerSettingsReceived(const ServerSettings& acSettings) noexcept;
void OnNotifyPlayerRespawn(const NotifyPlayerRespawn& acMessage) const noexcept;
void OnGridCellChangeEvent(const GridCellChangeEvent& acEvent) const noexcept;
void OnCellChangeEvent(const CellChangeEvent& acEvent) const noexcept;
void OnPlayerDialogueEvent(const PlayerDialogueEvent& acEvent) const noexcept;
void OnPlayerLevelEvent(const PlayerLevelEvent& acEvent) const noexcept;
void OnPartyJoinedEvent(const PartyJoinedEvent& acEvent) noexcept;
void OnPartyLeftEvent(const PartyLeftEvent& acEvent) noexcept;
private:
/**
* @brief Run the respawn timer, and if it hits 0, respawn the player.
*/
void RunRespawnUpdates(const double acDeltaTime) noexcept;
void RunPostDeathUpdates(const double acDeltaTime) noexcept;
/**
* @brief Make sure difficulty doesn't get changed while connected
*/
void RunDifficultyUpdates() const noexcept;
void RunLevelUpdates() const noexcept;
void RunBeastFormDetection() const noexcept;
void ToggleDeathSystem(bool aSet) noexcept;
World& m_world;
entt::dispatcher& m_dispatcher;
TransportService& m_transport;
double m_respawnTimer = 0.0;
int32_t m_serverDifficulty = 6;
int32_t m_previousDifficulty = 6;
bool m_isDeathSystemEnabled = true;
bool m_knockdownStart = false;
double m_knockdownTimer = 0.0;
bool m_godmodeStart = false;
double m_godmodeTimer = 0.0;
uint32_t m_cachedMainSpellId = 0;
uint32_t m_cachedSecondarySpellId = 0;
uint32_t m_cachedPowerId = 0;
entt::scoped_connection m_updateConnection;
entt::scoped_connection m_connectedConnection;
entt::scoped_connection m_disconnectedConnection;
entt::scoped_connection m_settingsConnection;
entt::scoped_connection m_notifyRespawnConnection;
entt::scoped_connection m_gridCellChangeConnection;
entt::scoped_connection m_cellChangeConnection;
entt::scoped_connection m_playerDialogueConnection;
entt::scoped_connection m_playerLevelConnection;
entt::scoped_connection m_partyJoinedConnection;
entt::scoped_connection m_partyLeftConnection;
};