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); } }