diff --git a/SQCSim-srv/connection.cpp b/SQCSim-srv/connection.cpp index 520c886..700c1da 100644 --- a/SQCSim-srv/connection.cpp +++ b/SQCSim-srv/connection.cpp @@ -93,16 +93,23 @@ void Connection::sendPacks(SOCKET sock, std::unordered_map= SYNC_ACC) { - outs -= SYNC_ACC; + static bool syncdead = false; + bool dead = player->AmIDead(); + + if (outs >= SYNC_ACC || (!syncdead && dead)) { Sync sync; - sync.hp = player->GetHP(); + outs -= SYNC_ACC; sync.timestamp = out.timestamp; sync.position = out.position; sync.sid = m_loginfo.sid; sync.timer = timer; sync.timestamp = out.timestamp; sync.ammo = -1; + sync.hp = player->GetHP(); + if (dead) { + sync.timestamp = m_loginfo.sid; + syncdead = true; + } sendPackTo(sock, &sync, &m_bufout, &m_addr); } @@ -118,7 +125,7 @@ Timestamp Connection::Run(World* world) { bool dead = player->AmIDead(); - if (m_input_manifest.size() < 2) + if (m_input_manifest.size() < 2 && !dead) return tstamp; while (m_last_in < m_input_vector.size() - 1 || dead) { diff --git a/SQCSim-srv/server.cpp b/SQCSim-srv/server.cpp index b06476d..6d7153c 100644 --- a/SQCSim-srv/server.cpp +++ b/SQCSim-srv/server.cpp @@ -230,12 +230,12 @@ void Server::Run() { Chat* startchat = new Chat(); startchat->src_id = 0; char startmess[] = "How would -YOU- like to die today, motherf-words?"; - + float endtime = 0.; strcpy(startchat->mess, 140, startmess); chatlog.emplace_back(startchat); - while (!endgame) { + while (!endgame && endtime < 1.) { using namespace std::chrono; Timestamp tstamp = duration_cast(high_resolution_clock::now() - start).count(); @@ -245,7 +245,8 @@ void Server::Run() { if (timer_acc >= 1000) { while (timer_acc >= 1000) timer_acc -= 1000; - --timer; + if (!endgame) + --timer; std::string str = "Timer: "; Log(str.append(std::to_string(timer)), false, false); } @@ -323,8 +324,43 @@ void Server::Run() { /* Out */ conn->sendPacks(m_sock_udp, m_conns, timer); - if ((deadplayers == players - 1 && deadplayers != 0) || timer < 0) + if ((deadplayers == players - 1 && deadplayers != 0) || timer < 0) { + if (!endgame) { + Chat* gameover = new Chat(); + gameover->dest_id = gameover->dest_team_id = gameover->src_id = 0; + std::string winner, winmess; + int score = 0; + bool plural = false; + for (auto& [key, conn] : m_conns) { + if (conn->player->getScore() > score) { + winner = conn->player->GetUsername(); + score = conn->player->getScore(); + plural = false; + } + else if (conn->player->getScore() == score) { + winner = winner.append(" and ").append(conn->player->GetUsername()); + plural = true; + } + } + + winmess = "And the winner"; + if (!plural) + winmess = winmess.append(" is "); + else winmess = winmess.append("s are "); + + winmess = winmess.append(winner).append(" with ").append(std::to_string(score)).append(" point"); + + if (score > 1) + winmess = winmess.append("s."); + else winmess = winmess.append("."); + + strcpy(gameover->mess, 140, winmess.c_str()); + + chatlog.emplace_back(gameover); + } endgame = true; + endtime += .001; + } } for (auto& bull : netbull) { @@ -338,7 +374,7 @@ void Server::Run() { for (auto bull = bullets.begin(); bull != bullets.end(); ++bull) { ChunkMod* cmod = nullptr; Bullet* bullet = *bull; - if (bullet->Update(m_world, (1. / 60.), 20, m_players, &cmod)) { + if (bullet->Update(m_world, (1. / 60.), 10, m_players, &cmod)) { if (cmod) chunkdiffs.emplace_back(cmod); bullit.push_back(bull); diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index a58dacc..e174ac6 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -1508,6 +1508,9 @@ void Engine::Render(float elapsedTime) { SystemNotification("syncsid be no good."); break; } + if (sync.timestamp == m_conn.getId()) { + m_player.SetHP(sync.hp); + } if (m_syncs.count(sync.timestamp)) { Sync comp = m_syncs[sync.timestamp]; m_otherplayerpos = sync.position;