#pragma once #include "Events/ConnectedEvent.h" #include "Events/DisconnectedEvent.h" #include #include struct ImguiService; struct UpdateEvent; struct ClientMessage; struct AuthenticationResponse; struct NotifySettingsChange; struct World; using TiltedPhoques::Client; /** * @brief Handles communication with the server. */ struct TransportService : Client { TransportService(World& aWorld, entt::dispatcher& aDispatcher) noexcept; ~TransportService() noexcept = default; TP_NOCOPYMOVE(TransportService); bool Send(const ClientMessage& acMessage) const noexcept; void OnConsume(const void* apData, uint32_t aSize) override; void OnConnected() override; void OnDisconnected(EDisconnectReason aReason) override; void OnUpdate() override; [[nodiscard]] bool IsOnline() const noexcept { return m_connected; } void SetServerPassword(const std::string& acPassword) noexcept { m_serverPassword = acPassword; } const uint32_t& GetLocalPlayerId() const noexcept { return m_localPlayerId; } protected: // Event handlers void HandleUpdate(const UpdateEvent& acEvent) noexcept; void HandleConnected(const ConnectedEvent& acEvent) noexcept; void HandleDisconnected(const DisconnectedEvent& acEvent) noexcept; // Packet handlers void HandleAuthenticationResponse(const AuthenticationResponse& acMessage) noexcept; void HandleNotifySettingsChange(const NotifySettingsChange& acMessage) noexcept; private: World& m_world; entt::dispatcher& m_dispatcher; bool m_connected; String m_serverPassword{}; uint32_t m_localPlayerId; entt::scoped_connection m_updateConnection; entt::scoped_connection m_sendServerMessageConnection; entt::scoped_connection m_settingsChangeConnection; entt::scoped_connection m_connectedConnection; entt::scoped_connection m_disconnectedConnection; std::function&)> m_messageHandlers[kServerOpcodeMax]; };