#pragma once #include namespace td { namespace server { class Server; class IServerState { 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(IServerSocket& a_Server); virtual ~IServerState() {} private: IServerSocket& m_Socket; Server* m_Server; void SetServer(Server* a_Server) { m_Server = a_Server; } friend class Server; }; } // namespace server } // namespace td