Prior to this commit, the intent had been to delete players entirely
when they had no remaining connections. But this code was broken for
the same reason as the bug fixed in the previous commit (filter
returns a new array).
But instead of fixing that bug, here we're actually changing the
semantics so that once a player has so remaining connections they are
simply marked as active:false. This is still broadcast out to all
active players as a "player-exit" event but it means the server is
holding onto the data so that a player can reclaim their spot (and
their score) by rejoining later.
this.name = name;
this.connections = [connection];
this.team = no_team;
this.name = name;
this.connections = [connection];
this.team = no_team;
}
add_connection(connection) {
}
add_connection(connection) {
remove_player_connection(player, connection) {
const remaining = player.remove_connection(connection);
if (remaining === 0) {
remove_player_connection(player, connection) {
const remaining = player.remove_connection(connection);
if (remaining === 0) {
const player_data = JSON.stringify({ id: player.id });
const player_data = JSON.stringify({ id: player.id });
- this.players.filter(p => p !== player);
- delete this.players_by_session[player.session_id];
this.broadcast_event("player-exit", player_data);
}
}
this.broadcast_event("player-exit", player_data);
}
}
/* And the player-info event. */
response.write(`event: player-info\ndata: ${player.info_json()}\n\n`);
/* And the player-info event. */
response.write(`event: player-info\ndata: ${player.info_json()}\n\n`);
- /* As well as player-enter events for all existing players. */
- this.players.filter(p => p !== player).forEach(p => {
+ /* As well as player-enter events for all existing, active players. */
+ this.players.filter(p => p !== player && p.active).forEach(p => {
response.write(`event: player-enter\ndata: ${p.info_json()}\n\n`);
});
response.write(`event: player-enter\ndata: ${p.info_json()}\n\n`);
});