From 36a1ab0572909341ca8f1460c94991d083a53281 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sun, 19 Dec 2021 11:57:47 +0100 Subject: [PATCH] feat: close server when game finished --- include/game/client/Client.h | 10 ++++++---- include/game/server/Server.h | 10 ++++++---- src/game/client/Client.cpp | 10 ++++++++-- src/game/server/Server.cpp | 33 +++++++++++++++++++++------------ src/game/server/ServerGame.cpp | 3 +++ 5 files changed, 44 insertions(+), 22 deletions(-) diff --git a/include/game/client/Client.h b/include/game/client/Client.h index 581d93f..2edd9f6 100644 --- a/include/game/client/Client.h +++ b/include/game/client/Client.h @@ -19,16 +19,16 @@ class Client { private: render::Renderer* m_Renderer; ClientConnexion m_Connexion; - ClientGame m_Game; + std::unique_ptr m_Game; bool m_Connected; public: - Client(render::Renderer* renderer) : m_Renderer(renderer), m_Game(this), m_Connected(false) {} + Client(render::Renderer* renderer) : m_Renderer(renderer), m_Game(std::make_unique(this)), m_Connected(false) {} - const ClientGame& getGame() const { return m_Game; } + const ClientGame& getGame() const { return *m_Game; } const ClientConnexion& getConnexion() const { return m_Connexion; } render::Renderer* getRenderer() const { return m_Renderer; } - ClientGame& getGame() { return m_Game; } + ClientGame& getGame() { return *m_Game; } ClientConnexion& getConnexion() { return m_Connexion; } void tick(std::uint64_t delta); @@ -45,6 +45,8 @@ public: void placeTower(game::TowerType type, const glm::vec2& position); void upgradeTower(game::TowerID tower, game::TowerLevel level); void removeTower(game::TowerID tower); +private: + void reset(); }; } // namespace client diff --git a/include/game/server/Server.h b/include/game/server/Server.h index dfff91d..55f14b8 100644 --- a/include/game/server/Server.h +++ b/include/game/server/Server.h @@ -61,12 +61,11 @@ private: bool m_ServerRunning; public: Server(const std::string& worldFilePath); - virtual ~Server() {} + virtual ~Server(); bool start(std::uint16_t port); - void stop(); - - void lauchGame(); + void stop(); // force the server to stop + void close(); // at the end of a game void removeConnexion(std::uint8_t connexionID); @@ -74,6 +73,8 @@ public: float getTPS() const { return m_TickCounter.getTPS(); } + bool isRunning() { return m_ServerRunning; } + const ServerGame& getGame() const { return m_Game; } ServerGame& getGame() { return m_Game; } @@ -88,6 +89,7 @@ private: void accept(); void updateSockets(); + void clean(); void startThread(); void stopThread(); void tick(std::uint64_t delta); diff --git a/src/game/client/Client.cpp b/src/game/client/Client.cpp index 1241f0b..455b0b9 100644 --- a/src/game/client/Client.cpp +++ b/src/game/client/Client.cpp @@ -40,13 +40,19 @@ void Client::tick(std::uint64_t delta) { m_Connected = m_Connexion.updateSocket(); if (!m_Connected) { std::cout << "Disconnected ! (Reason : " << m_Connexion.getDisconnectReason() << ")\n"; + reset(); } else { - m_Game.tick(delta); + m_Game->tick(delta); } } void Client::render() { - m_Game.renderWorld(); + m_Game->renderWorld(); +} + +void Client::reset() { + m_Game.reset(0); + m_Game = std::make_unique(this); } void Client::sendMobs(const std::vector& mobSends) { diff --git a/src/game/server/Server.cpp b/src/game/server/Server.cpp index d5762ef..e7c8b72 100644 --- a/src/game/server/Server.cpp +++ b/src/game/server/Server.cpp @@ -9,8 +9,9 @@ Server::Server(const std::string& worldFilePath) : m_ServerRunning(false) { m_Game.getWorld()->loadMapFromFile(worldFilePath); } -void Server::lauchGame() { - m_Game.startGame(); +Server::~Server() { + if (m_Thread.joinable()) + m_Thread.join(); } void Server::startThread() { @@ -29,13 +30,16 @@ void Server::startThread() { } } + clean(); }); } +void Server::close() { + stopThread(); +} + void Server::stopThread() { m_ServerRunning = false; - if (m_Thread.joinable()) - m_Thread.join(); } bool Server::start(std::uint16_t port) { @@ -54,19 +58,24 @@ bool Server::start(std::uint16_t port) { return true; } -void Server::stop() { - if (!m_ServerRunning) - return; - stopThread(); - - protocol::DisconnectPacket packet("Server closed"); - broadcastPacket(&packet); - +void Server::clean() { m_Listener.close(); m_Listener.destroy(); m_Connections.clear(); getPlayers().clear(); + + std::cout << "Server successfully stopped !\n"; +} + +void Server::stop() { + if (!m_ServerRunning) + return; + + protocol::DisconnectPacket packet("Server closed"); + broadcastPacket(&packet); + + stopThread(); } void Server::tick(std::uint64_t delta) { diff --git a/src/game/server/ServerGame.cpp b/src/game/server/ServerGame.cpp index 3afaaf7..2a1b912 100644 --- a/src/game/server/ServerGame.cpp +++ b/src/game/server/ServerGame.cpp @@ -95,6 +95,9 @@ void ServerGame::OnGameClose() { // Disconnect clients protocol::DisconnectPacket packet("Game finished"); m_Server->broadcastPacket(&packet); + + // Closing server + m_Server->close(); } } // namespace game