back to lobby state when server ends
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 });
|
||||||
|
|||||||
Reference in New Issue
Block a user