diff --git a/SQCSim-srv/server.cpp b/SQCSim-srv/server.cpp index d4773bf..77f31e8 100644 --- a/SQCSim-srv/server.cpp +++ b/SQCSim-srv/server.cpp @@ -17,9 +17,9 @@ Server::~Server() { if (m_sock_udp) closesocket(m_sock_udp); if (m_sock_tcp) - closesocket(m_sock_tcp); + closesocket(m_sock_tcp); for (const auto& [key, player] : m_players) - closesocket(player->getSock()); + closesocket(player->getSock()); m_players.clear(); delete m_world; #ifdef _WIN32 @@ -69,15 +69,16 @@ int Server::Init() { } int Server::Ready() { - int nbrjoueurs = 0, + int nbrjoueurs = 0, nbrconn = 0; bool readystart = false; do { Log("Entrez la duree de la partie: ", false, false); std::cin.getline(m_buf.ptr, BUFFER_LENGTH); - try { + try { m_game.countdown = std::stoi(m_buf.ptr); - } catch(const std::exception& e) { + } + catch (const std::exception& e) { Log(e.what(), true, false); m_game.countdown = 0; } @@ -85,9 +86,10 @@ int Server::Ready() { do { Log("Entrez le seed de la partie: ", false, false); std::cin.getline(m_buf.ptr, BUFFER_LENGTH); - try { + try { m_game.seed = 9370707;//std::stoi(m_buf.ptr); - } catch(const std::exception& e) { + } + catch (const std::exception& e) { Log(e.what(), true, false); m_game.seed = 0; } @@ -95,9 +97,10 @@ int Server::Ready() { do { Log("Entrez le nombre de joueurs: ", false, false); std::cin.getline(m_buf.ptr, BUFFER_LENGTH); - try { + try { nbrjoueurs = std::stoi(m_buf.ptr); - } catch(const std::exception& e) { + } + catch (const std::exception& e) { Log(e.what(), true, false); nbrjoueurs = 0; } @@ -113,9 +116,9 @@ int Server::Ready() { } buildIdList(ID_LIST_SIZE); - + Log("A l'ecoute sur le port: " + std::to_string(SRV_PORT), false, false); - + while (!readystart) { sockaddr_in sockad; addrlen_t addrlen = sizeof(sockad); @@ -135,7 +138,7 @@ int Server::Ready() { if (pck.type != PACKET_TYPE::LOGINF) { Log("Paquet invalide.", true, false); if (pck.type != PACKET_TYPE::ERR) - netprot::emptyPack(pck); + netprot::emptyPack(pck); continue; // Passer au prochain appel si c'est pas un LoginInfo ou un LoginInfo invalide qui rentre. } LoginInfo* log = (LoginInfo*)pck.ptr; @@ -145,17 +148,17 @@ int Server::Ready() { Log(str.append(" Nom: ").append(log->name), false, false); str.clear(); - + sendPackTo(m_sock_udp, log, &m_buf, &sockad); - + play.id = getUniqueId(); play.tid = log->tid; strcpy(play.name, log->name); Log(str.append(play.name).append(" SID: [").append(std::to_string(log->sid)).append("]") - .append(" ID: [").append(std::to_string(play.id)).append("]") - .append(" TID: [").append(std::to_string(play.tid)).append("]"), false, false); + .append(" ID: [").append(std::to_string(play.id)).append("]") + .append(" TID: [").append(std::to_string(play.tid)).append("]"), false, false); play.tid = log->tid; sendPackTo(m_sock_udp, &m_game, &m_buf, &sockad); @@ -174,7 +177,7 @@ int Server::Ready() { for (auto& [keyin, playin] : m_players) // Not pretty, but it works. for (auto& [keyout, playout] : m_players) { if (keyin == keyout) - continue; + continue; sendPackTo(m_sock_udp, playout->getInfo(), &m_buf, playin->getAddr()); // et envoyer les infos des joueurs distants au nouveau joueur. } @@ -207,66 +210,72 @@ void Server::Run() { sync.timestamp = 0; sync.timer = m_game.countdown; sendPackTo(m_sock_udp, &sync, &m_buf, conn->getAddr()); + } - int timer = m_game.countdown, sync_acc = 0; - std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now(); - Timestamp last = 0; + int timer = m_game.countdown, sync_acc = 0; + std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now(); + Timestamp last = 0; + std::vector chatlog; - while (!endgame) { - using namespace std::chrono; - Timestamp tstamp = duration_cast(high_resolution_clock::now() - start).count(); + while (!endgame) { + using namespace std::chrono; + Timestamp tstamp = duration_cast(high_resolution_clock::now() - start).count(); - if (last == 0) - last = tstamp; - sync_acc += tstamp - last; - if (sync_acc >= 1000) { - sync_acc -= 1000; - --timer; - } - - for (auto& [key, conn] : m_players) { - int deadplayers = 0; - std::vector lsPck; - Input in; - Sync sync; - lsPck = recvPacks(m_sock_udp, &m_buf); - for (auto& pck : lsPck) { - uint32_t bsize = m_buf.len - (pck - m_buf.ptr); - switch (netprot::getType(pck, 1)) { - using enum netprot::PACKET_TYPE; - case INPUT: - if (Deserialize(&in, pck, &bsize)) { - m_players[in.sid]->AddInput(in); - } - break; - case SYNC: - if (Deserialize(&sync, pck, &bsize)) {} - break; - case CHAT: - // TODO: Pitcher les chats à tous le monde. - break; - default: break; - } - } - lsPck.clear(); - - if (conn->m_nsync) { - if (conn->player->AmIDead()) { - ++deadplayers; - continue; - } - conn->Run(m_world); - conn->sendPacks(m_sock_udp, m_players, timer); - } - - if (deadplayers == players - 1 || timer <= 0) - endgame = true; - } + if (last == 0) + last = tstamp; + sync_acc += tstamp - last; + if (sync_acc >= 1000) { + sync_acc -= 1000; + --timer; } - // TODO: Gérer les 2-3 secondes post-game avant le billboard pour pas avoir un whiplash à la fin de la game. + for (auto& [key, conn] : m_players) { + int deadplayers = 0; + std::vector lsPck; + Input in; Chat chat; Sync sync; + lsPck = recvPacks(m_sock_udp, &m_buf); + for (auto& pck : lsPck) { + uint32_t bsize = m_buf.len - (pck - m_buf.ptr); + switch (netprot::getType(pck, 1)) { + using enum netprot::PACKET_TYPE; + case INPUT: + if (Deserialize(&in, pck, &bsize)) + m_players[in.sid]->AddInput(in); + break; + case SYNC: + if (Deserialize(&sync, pck, &bsize)) {} + break; + case CHAT: + if (Deserialize(&chat, pck, &bsize)) + chatlog.push_back(chat); + break; + default: break; + } + } + lsPck.clear(); + if (conn->m_nsync) { + if (conn->player->AmIDead()) { + ++deadplayers; + conn->m_nsync == false; + continue; + } + conn->Run(m_world); + conn->sendPacks(m_sock_udp, m_players, timer); + } + + if (deadplayers == players - 1 || timer <= 0) + endgame = true; + } + + for (auto& chat : chatlog) + for (auto& [key, conn] : m_players) + sendPackTo(m_sock_udp, &chat, &m_buf, conn->getAddr()); + chatlog.clear(); } + + // TODO: Gérer les 2-3 secondes post-game avant le billboard pour pas avoir un whiplash à la fin de la game. + } inline std::string Server::LogTimestamp() { @@ -291,13 +300,13 @@ inline std::string Server::LogTimestamp() { void Server::Log(std::string str, bool is_error = false, bool is_fatal = false) { switch (m_log) { using enum LOG_DEST; // C++20! - case LOGFILE: - m_logfile << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; - break; - case CONSOLE: [[fallthrough]]; // Pour dire que c'est voulu que ça traverse vers le case en dessous (C++17!) - default: - std::cout << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; - break; + case LOGFILE: + m_logfile << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; + break; + case CONSOLE: [[fallthrough]]; // Pour dire que c'est voulu que ça traverse vers le case en dessous (C++17!) + default: + std::cout << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; + break; } if (is_fatal) { @@ -325,7 +334,7 @@ void Server::buildIdList(size_t size) { srand(time(NULL)); do lst.insert(((uint64_t)rand() << 32 | rand())); while (lst.size() < size); - + m_ids = std::vector(lst.begin(), lst.end()); } diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index 447b66f..d8945db 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -1339,8 +1339,6 @@ void Engine::Render(float elapsedTime) { if (diff.y < 1.) diff.y = 0; - //std::cout << sync.timestamp << " ms: " << comp.position << " - " << sync.position << " Diff: " << diff.Length() << std::endl; - if (diff.Length() > 1.5) { diff.Normalize(); m_player.Move(-diff);