]> git.cworth.org Git - empires-server/commitdiff
Mark players as active:false when they drop all connections
authorCarl Worth <cworth@cworth.org>
Thu, 25 Jun 2020 01:29:45 +0000 (18:29 -0700)
committerCarl Worth <cworth@cworth.org>
Fri, 26 Jun 2020 14:37:59 +0000 (07:37 -0700)
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.

game.js

diff --git a/game.js b/game.js
index 4649b56704a41f8c103e492c09560344cfadb299..7ca150735269d0c0b6c4bc0681e70302d4a41813 100644 (file)
--- a/game.js
+++ b/game.js
@@ -9,6 +9,7 @@ class Player {
     this.name = name;
     this.connections = [connection];
     this.team = no_team;
+    this.active = true;
   }
 
   add_connection(connection) {
@@ -214,9 +215,8 @@ class Game {
   remove_player_connection(player, connection) {
     const remaining = player.remove_connection(connection);
     if (remaining === 0) {
+      player.active = false;
       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);
     }
   }
@@ -266,8 +266,8 @@ class Game {
     /* 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`);
     });