Fix: Handle remote player disconnections.

This commit is contained in:
Ritchie Cunningham 2025-09-14 02:06:35 +01:00
parent 81b8972742
commit 6aa204672e

View File

@ -9,6 +9,7 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include <fcntl.h> #include <fcntl.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <set>
#include <cstdio> #include <cstdio>
#include <future> #include <future>
#include <string> #include <string>
@ -278,6 +279,9 @@ void Bettola::render(void) {
} }
void Bettola::process_game_state(const BettolaLib::Network::GameStateMessage& msg) { void Bettola::process_game_state(const BettolaLib::Network::GameStateMessage& msg) {
/* Track remote players each update. */
std::set<unsigned int> players_in_message;
for(unsigned int i = 0; i < msg.num_players; ++i) { for(unsigned int i = 0; i < msg.num_players; ++i) {
const auto& player_state = msg.players[i]; const auto& player_state = msg.players[i];
@ -297,6 +301,7 @@ void Bettola::process_game_state(const BettolaLib::Network::GameStateMessage& ms
} }
} else { } else {
/* Remote player. Find if we already know about them.. */ /* Remote player. Find if we already know about them.. */
players_in_message.insert(player_state.player_id);
auto it = std::find_if(_remote_players.begin(), _remote_players.end(), auto it = std::find_if(_remote_players.begin(), _remote_players.end(),
[&](const RemotePlayer& p) { [&](const RemotePlayer& p) {
return p.get_id() == player_state.player_id; return p.get_id() == player_state.player_id;
@ -311,7 +316,13 @@ void Bettola::process_game_state(const BettolaLib::Network::GameStateMessage& ms
} }
} }
} }
/* TODO: Remove players fomr _remote_players if they are no longer in the msg. */ _remote_players.erase(
std::remove_if(_remote_players.begin(), _remote_players.end(),
[&](const RemotePlayer& p) {
return players_in_message.find(p.get_id()) == players_in_message.end();
}),
_remote_players.end());
} }
bool Bettola::init_sdl(void) { bool Bettola::init_sdl(void) {