squidGame/tgx-games-client/assets/module_basic/scripts/NetworkReconnector.ts

103 lines
3.3 KiB
TypeScript

import { _decorator, Component, director, Node } from 'cc';
import { NetGameServer } from './NetGameServer';
import { WebsocketClient } from './WebsocketClient';
import { tgxSceneUtil, tgxUIAlert, tgxUIWaiting } from '../../core_tgx/tgx';
import { SubGameMgr } from './SubGameMgr';
import { UserMgr } from './UserMgr';
import { SceneUtil } from '../../core_tgx/base/SceneUtils';
import { SceneDef } from '../../scripts/SceneDef';
const { ccclass, property } = _decorator;
@ccclass('NetworkReconnector')
export class NetworkReconnector extends Component {
public static addToScene() {
let node = new Node('NetworkReconnector');
node.addComponent(NetworkReconnector);
director.getScene().addChild(node);
}
private _isInGame = false;
start() {
NetGameServer.inst.on(WebsocketClient.EVENT_DISCONNECTED, this.onDisconnected, this);
this._isInGame = director.getScene().name.indexOf('game_') == 0;
}
onDisconnected(v) {
if(v.reason == 'login_to_other'){
tgxUIAlert.show('账号在其他地方登录!').onClick(()=>{
tgxSceneUtil.loadScene(SceneDef.LOGIN);
});
return;
}
if (v.reason == 'normal' || v.reason == 'USER_LEAVE') {
return;
}
if (!v.isManual) {
//this.backToLogin();
this.tryReconnect();
}
}
private async tryReconnect() {
tgxUIWaiting.show('正在重连');
let isSucc = false;
if (this._isInGame) {
let ret = await SubGameMgr.inst.enterSubGame(NetGameServer.inst.authParams,UserMgr.inst.uid);
if (ret.isSucc) {
isSucc = true;
}
else if (ret.err.code == 'ROOM_NOT_EXISTS') {
SubGameMgr.gameMgr.backToLobby();
return;
}
}
else {
let params = NetGameServer.inst.authParams;
let ret = await NetGameServer.inst.ensureConnected();
isSucc = ret.isSucc;
/**
* @en if already login success, need to verify again
* @zh 如果已经登录成功,则需要再次验证
*/
if (ret.isSucc && params) {
let ret1 = await NetGameServer.inst.callApi('login/AuthClient', {
uid: UserMgr.inst.uid,
token: params.token,
time: params.time,
});
if (ret1.isSucc) {
SceneUtil.reloadScene();
isSucc = true;
}
else {
tgxUIWaiting.hide();
tgxUIAlert.show("登录验证失败,请重新登录!").onClick(bOK => {
tgxSceneUtil.loadScene(SceneDef.LOGIN);
});
return;
}
}
}
/**
* @en if re-connect failed, try again after 3s
* @zh 如果没有重连成功,则一定时间后再次尝试
*/
if (!isSucc) {
setTimeout(() => {
this.tryReconnect();
}, 3000);
}
else {
tgxUIWaiting.hide();
}
}
protected onDestroy(): void {
NetGameServer.inst.off(WebsocketClient.EVENT_DISCONNECTED, this.onDisconnected, this);
}
}