#include "game/server/Lobby.h" #include "game/server/Server.h" #include "protocol/packets/UpdateLobbyTimePacket.h" #include "misc/Time.h" #ifdef NDEBUG #define MIN_PLAYER_WAITING 2 #else #define MIN_PLAYER_WAITING 1 #endif namespace td { namespace server { /*static constexpr std::uint8_t timeNotifications[] = { 2 * 60, // 2 min 60 + 30, // 1 min 30 s 60, // 1 min 30, // 30 s 15, // 15 s 10, // 10 s 5, // 5 s 4, // 4 s 3, // 3 s 2, // 2 s 1, // 1 s };*/ Lobby::Lobby(Server* server) : m_Server(server), m_Timer(1000, std::bind(&Lobby::SendTimeRemaining, this)) { } void Lobby::Tick() { if (m_GameStarted || m_StartTime == 0) return; if (utils::GetTime() >= m_StartTime) { m_Server->GetGame().NotifyListeners(&game::GameListener::OnGameBegin); m_GameStarted = true; return; } //m_Timer.Update(); } void Lobby::SendTimeRemaining() { protocol::UpdateLobbyTimePacket packet(m_StartTime); m_Server->BroadcastPacket(&packet); } void Lobby::OnPlayerJoin(std::uint8_t playerID) { if (m_GameStarted) return; utils::LOG("(Server) Player Joined Lobby !"); m_Players.push_back(playerID); if (m_Players.size() == MIN_PLAYER_WAITING) { // start timer if a second player join the match m_StartTime = utils::GetTime() + static_cast(LobbyWaitingTime); m_Timer.Reset(); SendTimeRemaining(); } // notify player that just arrived protocol::UpdateLobbyTimePacket packet(m_StartTime); m_Server->GetConnexions().at(playerID).SendPacket(&packet); } void Lobby::OnPlayerLeave(std::uint8_t playerID) { if (m_GameStarted) return; utils::LOG("(Server) Player Leaved Lobby !"); auto it = std::find(m_Players.begin(), m_Players.end(), playerID); if (it == m_Players.end()) return; m_Players.erase(it); if (m_Players.size() == 1) { m_StartTime = 0; // reset timer if there is only one player left SendTimeRemaining(); } } } // namespace server } // namespace td