diff --git a/src/server/Client.ts b/src/server/Client.ts index cdd788764..68f0a2bfb 100644 --- a/src/server/Client.ts +++ b/src/server/Client.ts @@ -5,7 +5,6 @@ import { ClientID } from "../core/Schemas"; export class Client { public lastPing: number = Date.now(); - public isDisconnected: boolean = false; public hashes: Map = new Map(); diff --git a/src/server/GameServer.ts b/src/server/GameServer.ts index 89900ac84..300d8c063 100644 --- a/src/server/GameServer.ts +++ b/src/server/GameServer.ts @@ -43,6 +43,7 @@ export class GameServer { public activeClients: Client[] = []; // Used for record record keeping private allClients: Map = new Map(); + private clientsDisconnectedStatus: Map = new Map(); private _hasStarted = false; private _startTime: number | null = null; @@ -174,7 +175,6 @@ export class GameServer { return; } - client.isDisconnected = existing.isDisconnected; client.lastPing = existing.lastPing; this.activeClients = this.activeClients.filter((c) => c !== existing); @@ -184,6 +184,8 @@ export class GameServer { this.activeClients.push(client); client.lastPing = Date.now(); + this.markClientDisconnected(client.clientID, false); + this.allClients.set(client.clientID, client); client.ws.removeAllListeners("message"); @@ -571,25 +573,27 @@ export class GameServer { const now = Date.now(); for (const [clientID, client] of this.allClients) { - if ( - client.isDisconnected === false && - now - client.lastPing > this.disconnectedTimeout - ) { - this.markClientDisconnected(client, true); + const isDisconnected = this.isClientDisconnected(clientID); + if (!isDisconnected && now - client.lastPing > this.disconnectedTimeout) { + this.markClientDisconnected(clientID, true); } else if ( - client.isDisconnected && + isDisconnected && now - client.lastPing < this.disconnectedTimeout ) { - this.markClientDisconnected(client, false); + this.markClientDisconnected(clientID, false); } } } - private markClientDisconnected(client: Client, isDisconnected: boolean) { - client.isDisconnected = isDisconnected; + public isClientDisconnected(clientID: string): boolean { + return this.clientsDisconnectedStatus.get(clientID) ?? true; + } + + private markClientDisconnected(clientID: string, isDisconnected: boolean) { + this.clientsDisconnectedStatus.set(clientID, isDisconnected); this.addIntent({ type: "mark_disconnected", - clientID: client.clientID, + clientID: clientID, isDisconnected: isDisconnected, }); }