103 lines
3.3 KiB
TypeScript
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);
|
|
}
|
|
}
|
|
|