Как я могу узнать, вышел ли игрок из игры по памяти, чтобы принудительно выйти из игры, или потерял подключение к Интернету, чтобы дождаться повторного подключения Colyseus

#javascript #node.js #express #server

Вопрос:

Итак, у меня есть эта игра, сервер которой построен на colyseus v0.12.0. Я хочу выяснить, убил ли игрок игровой экземпляр или он потерял подключение к Интернету.

  1. если он убьет игру — отобразится табло других игроков, и все игроки покинут комнату, и она будет удалена.
  2. если у его телефона проблемы с Интернетом — мы пытаемся подключиться в течение определенного времени, если он вернется, мы возобновляем игру, если он не вернется, мы заставляем выйти из игры и показываем табло.

Вот код onLeave на сервере.

onLeave(consented) является логическим параметром, если он возвращает значение true, то это означает, что игрок вышел из
игры из опции «Выход из игр» в игре. если согласие является ложным, это означает, что либо экземпляр игры был убит пользователем, либо у него проблемы с Интернетом. Я хочу провести различие между этими двумя — «чтобы я мог заставить других игроков ждать, если это проблема с повторным подключением, или завершить игру, если он убил экземпляр игры».

     async onLeave(client, consented) {
        console.log("===============Leave ================");
        console.log(consented, "----Client Left----", client.sessionId);
        console.log(consented, "---------- Left----", 
        this.state.players[client.sessionId].name);
        console.log(consented, "---------- player----", 
        this.ClientUserName);
        //this.state.players[client.sessionId].connected = false;

        try {
            //     //Reconnection of client
            if (consented) {
                //this.allowReconnection(client,70); 
                console.log("----consented true----", client.sessionId);

                console.log("--------ROOM DISOPOSED------consented",
                  this.ourRoomName);

                if (this.ClientUserName[0] === 
                    this.state.players[client.sessionId].name) {
                    this.playersInRoom = 0;
                    console.log("1111111111111111111111");
                    this.broadcast(
                        {
                            en: "QuitLobby",
                            value: "host quit the lobby",
                        }, { except: client });
                    /*  for (var i = 0; i < this.ClientId.length; i  ) {
                      delete this.state.players[this.ClientId[i]];
                      }*/


                    this.disconnect();
                    this.ClientId = [];
                    this.ClientAvatar = [];
                    this.setState(this.state);
                }
                else {
                    this.playersInRoom--;
                    this.playerCount--;
                    console.log(this.users.length)
                    for (let i = 0; i < this.ClientUserName.length; i  ) {
                        if (this.ClientUserName[i] === 
                            this.state.players[client.sessionId].name) {
                            this.ClientUserName.splice(i, 1);

                            this.ClientId.splice(i, 1);

                            this.ClientAvatar.splice(i, 1);

                            this.users.splice(i   1, 1);
                        }
                    }
                    console.log(this.playersInRoom)
                    console.log(this.users.length)


                    this.broadcast({
                        en: 'playerInfo',
                        playerData: {
                            idArr: this.ClientId,
                            nameArr: this.ClientUserName,
                            avatarArr: this.ClientAvatar // added avtar
                        }
                    })

                }

            }
            else {
                await this.allowReconnection(client, 20);
                this.state.players[client.sessionId].connected = true;
                // delete this.state.players[client.sessionId];    //after 
              reconnection the player is not able to see anybody else's card
                this.broadcast({
                    en: 'DisconnectedTemp',
                    value: client.sessionId,
                })

                console.log("----Client Reconnect----", client.sessionId);
                

            }
        } catch (e) {
            delete this.state.players[client.sessionId];
        }

    }