this.name = name;
this.connections = [connection];
this.team = no_team;
+ this.active = true;
}
add_connection(connection) {
this.id = id;
this.players = [];
this.players_by_session = {};
+ this.active_players = 0;
this.next_player_id = 1;
this.teams = [];
this.state = {
/* First see if we already have a player object for this session. */
const existing = this.players_by_session[session.id];
if (existing) {
+ if (! existing.active) {
+ /* If we're re-activating a previously idled player, then we
+ * need to alert everyone that this player is now back.
+ */
+ existing.active = true;
+ this.active_players++;
+ this.broadcast_event("player-enter", existing.info_json());
+ }
existing.add_connection(connection);
return existing;
}
/* Broadcast before adding player to list (to avoid announcing the
* new player to itself). */
- const player_data = JSON.stringify({ id: player.id, name: player.name });
- this.broadcast_event("player-enter", player_data);
+ this.broadcast_event("player-enter", player.info_json());
this.players.push(player);
this.players_by_session[session.id] = player;
+ this.active_players++;
this.next_player_id++;
/* After adding the player to the list, and if we are already past
remove_player_connection(player, connection) {
const remaining = player.remove_connection(connection);
if (remaining === 0) {
+ player.active = false;
+ this.active_players--;
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);
}
}
/* 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`);
});