back to lobby state when server ends

This commit is contained in:
2023-08-14 13:35:17 +02:00
parent 118a04cd01
commit 7f650f282c
7 changed files with 36 additions and 10 deletions

View File

@@ -12,7 +12,7 @@ class Server;
class Lobby { class Lobby {
private: private:
Server* m_Server; Server* m_Server;
bool m_GameStarted = false; bool m_LobbyOpened = false;
std::uint64_t m_StartTimerTime = 0; std::uint64_t m_StartTimerTime = 0;
std::vector<std::uint8_t> m_Players; std::vector<std::uint8_t> m_Players;
utils::AutoTimer m_Timer; utils::AutoTimer m_Timer;
@@ -22,6 +22,8 @@ public:
void OnPlayerJoin(std::uint8_t playerID); void OnPlayerJoin(std::uint8_t playerID);
void OnPlayerLeave(std::uint8_t playerID); void OnPlayerLeave(std::uint8_t playerID);
void OpenLobby();
void SendTimeRemaining(); void SendTimeRemaining();
void Tick(); void Tick();

View File

@@ -70,6 +70,8 @@ public:
void Stop(); // force the server to stop void Stop(); // force the server to stop
void Close(); // at the end of a game void Close(); // at the end of a game
void Restart(); // go back to lobby state
bool LoadMap(const std::string& worldFilePath); bool LoadMap(const std::string& worldFilePath);
bool IsMapLoaded(); bool IsMapLoaded();

View File

@@ -171,6 +171,8 @@ public:
void Tick(std::uint64_t delta); void Tick(std::uint64_t delta);
void Reset(); // clear mobs and towers
void SpawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir); void SpawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir);
TowerPtr PlaceTowerAt(TowerID id, TowerType type, std::int32_t x, std::int32_t y, PlayerID builder); TowerPtr PlaceTowerAt(TowerID id, TowerType type, std::int32_t x, std::int32_t y, PlayerID builder);

View File

@@ -32,13 +32,19 @@ Lobby::Lobby(Server* server) : m_Server(server), m_Timer(1000, std::bind(&Lobby:
} }
void Lobby::OpenLobby() {
m_Players.clear();
m_LobbyOpened = true;
m_StartTimerTime = 0;
}
void Lobby::Tick() { void Lobby::Tick() {
if (m_GameStarted || m_StartTimerTime == 0) if (!m_LobbyOpened || m_StartTimerTime == 0)
return; return;
if (utils::GetTime() - m_StartTimerTime >= LobbyWaitingTime) { if (utils::GetTime() - m_StartTimerTime >= LobbyWaitingTime) {
m_Server->GetGame().NotifyListeners(&game::GameListener::OnGameBegin); m_Server->GetGame().NotifyListeners(&game::GameListener::OnGameBegin);
m_GameStarted = true; m_LobbyOpened = false;
return; return;
} }
@@ -51,8 +57,9 @@ void Lobby::SendTimeRemaining() {
} }
void Lobby::OnPlayerJoin(std::uint8_t playerID) { void Lobby::OnPlayerJoin(std::uint8_t playerID) {
if (m_GameStarted) if (!m_LobbyOpened)
return; return;
utils::LOG("(Server) Player Joined Lobby !"); utils::LOG("(Server) Player Joined Lobby !");
m_Players.push_back(playerID); m_Players.push_back(playerID);
if (m_Players.size() == MIN_PLAYER_WAITING) { // start timer if a second player join the match if (m_Players.size() == MIN_PLAYER_WAITING) { // start timer if a second player join the match
@@ -63,8 +70,9 @@ void Lobby::OnPlayerJoin(std::uint8_t playerID) {
} }
void Lobby::OnPlayerLeave(std::uint8_t playerID) { void Lobby::OnPlayerLeave(std::uint8_t playerID) {
if (m_GameStarted) if (!m_LobbyOpened)
return; return;
utils::LOG("(Server) Player Leaved Lobby !"); utils::LOG("(Server) Player Leaved Lobby !");
auto it = std::find(m_Players.begin(), m_Players.end(), playerID); auto it = std::find(m_Players.begin(), m_Players.end(), playerID);

View File

@@ -52,6 +52,12 @@ void Server::StartThread() {
}); });
} }
void Server::Restart() {
m_Game.GetWorld()->Reset();
m_Lobby.OpenLobby();
m_Game.SetGameState(game::GameState::Lobby);
}
void Server::Close() { void Server::Close() {
StopThread(); StopThread();
} }
@@ -76,6 +82,7 @@ bool Server::Start(std::uint16_t port, bool blocking) {
utils::LOG(utils::format("Server started at port %u !", port)); utils::LOG(utils::format("Server started at port %u !", port));
m_TickCounter.Reset(); m_TickCounter.Reset();
m_ServerRunning = true; m_ServerRunning = true;
m_Lobby.OpenLobby();
if (blocking) { if (blocking) {
ServerLoop(); ServerLoop();
} else { } else {
@@ -166,9 +173,9 @@ void Server::OnPlayerLeave(std::uint8_t id) {
protocol::PlayerLeavePacket packet(id); protocol::PlayerLeavePacket packet(id);
BroadcastPacket(&packet); BroadcastPacket(&packet);
if (GetPlayers().empty()) { if (GetPlayers().empty() && m_Game.GetGameState() != game::GameState::Lobby) {
utils::LOG("All players left. Stopping server ..."); utils::LOG("All players left. Go back to lobby ...");
Stop(); Restart();
} }
} }

View File

@@ -122,8 +122,8 @@ void ServerGame::OnGameClose() {
protocol::DisconnectPacket packet("Game finished"); protocol::DisconnectPacket packet("Game finished");
m_Server->BroadcastPacket(&packet); m_Server->BroadcastPacket(&packet);
// Closing server // Put back to lobby state
m_Server->Close(); m_Server->Restart();
} }
} // namespace game } // namespace game

View File

@@ -110,6 +110,11 @@ void World::Tick(std::uint64_t delta) {
CleanDeadMobs(); CleanDeadMobs();
} }
void World::Reset() {
m_Towers.clear();
m_Mobs.clear();
}
void World::SpawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir) { void World::SpawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir) {
MobPtr mob = MobFactory::CreateMob(id, type, level, sender); MobPtr mob = MobFactory::CreateMob(id, type, level, sender);
mob->SetCenter({ x, y }); mob->SetCenter({ x, y });