#pragma once #include #include namespace td { namespace server { class Server; class IServerState : private utils::SlotGuard { protected: void SendPacket(PlayerID a_Id, const protocol::PacketBase& a_Packet); void SetNewState(const std::shared_ptr& a_NewState); public: virtual void HandlePacket(PlayerID a_Id, const protocol::PacketBase& a_Packet) = 0; virtual void Update(float a_Delta) = 0; virtual void OnPlayerJoin(PlayerID a_Id) = 0; virtual void OnPlayerLeave(PlayerID a_Id) = 0; IServerState(); virtual ~IServerState(); private: Server* m_Server; void SetServer(Server* a_Server); friend class Server; }; } // namespace server } // namespace td