From 4f4f499d474ac01aa06dcd98b67fcd333288a630 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=A9grier?= Date: Fri, 23 Apr 2021 13:44:04 +0200 Subject: [PATCH] Making alone mode more robust This fixes a number of issues where the game was attempting to access a non existing connection (in alone mode) --- front/src/Phaser/Game/GameScene.ts | 20 ++++++++++---------- front/src/Phaser/Menu/MenuScene.ts | 9 +++++---- front/src/Phaser/Menu/ReportMenu.ts | 18 +++++++++--------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 990f702c..144890a3 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -135,7 +135,7 @@ export class GameScene extends ResizableScene implements CenterListener { pendingEvents: Queue = new Queue(); private initPosition: PositionInterface|null = null; private playersPositionInterpolator = new PlayersPositionInterpolator(); - public connection!: RoomConnection; + public connection: RoomConnection|undefined; private simplePeer!: SimplePeer; private GlobalMessageManager!: GlobalMessageManager; public ConsoleGlobalMessageManager!: ConsoleGlobalMessageManager; @@ -416,7 +416,7 @@ export class GameScene extends ResizableScene implements CenterListener { //initialise list of other player this.MapPlayers = this.physics.add.group({immovable: true}); - + //create input to move mediaManager.setUserInputManager(this.userInputManager); this.userInputManager = new UserInputManager(this); @@ -712,7 +712,7 @@ export class GameScene extends ResizableScene implements CenterListener { if (JITSI_PRIVATE_MODE && !jitsiUrl) { const adminTag = allProps.get("jitsiRoomAdminTag") as string|undefined; - this.connection.emitQueryJitsiJwtMessage(roomName, adminTag); + this.connection?.emitQueryJitsiJwtMessage(roomName, adminTag); } else { this.startJitsi(roomName, undefined); } @@ -735,9 +735,9 @@ export class GameScene extends ResizableScene implements CenterListener { }); this.gameMap.onPropertyChange('silent', (newValue, oldValue) => { if (newValue === undefined || newValue === false || newValue === '') { - this.connection.setSilent(false); + this.connection?.setSilent(false); } else { - this.connection.setSilent(true); + this.connection?.setSilent(true); } }); this.gameMap.onPropertyChange('playAudio', (newValue, oldValue, allProps) => { @@ -1167,7 +1167,7 @@ ${escapedMessage} this.lastMoveEventSent = event; this.lastSentTick = this.currentTick; const camera = this.cameras.main; - this.connection.sharePosition(event.x, event.y, event.direction, event.moving, { + this.connection?.sharePosition(event.x, event.y, event.direction, event.moving, { left: camera.scrollX, top: camera.scrollY, right: camera.scrollX + camera.width, @@ -1233,7 +1233,7 @@ ${escapedMessage} * Put all the players on the map on map load. */ private doInitUsersPosition(usersPosition: MessageUserPositionInterface[]): void { - const currentPlayerId = this.connection.getUserId(); + const currentPlayerId = this.connection?.getUserId(); this.removeAllRemotePlayers(); // load map usersPosition.forEach((userPosition : MessageUserPositionInterface) => { @@ -1377,7 +1377,7 @@ ${escapedMessage} * Sends to the server an event emitted by one of the ActionableItems. */ emitActionableEvent(itemId: number, eventName: string, state: unknown, parameters: unknown) { - this.connection.emitActionableEvent(itemId, eventName, state, parameters); + this.connection?.emitActionableEvent(itemId, eventName, state, parameters); } public onResize(): void { @@ -1385,7 +1385,7 @@ ${escapedMessage} // Send new viewport to server const camera = this.cameras.main; - this.connection.setViewport({ + this.connection?.setViewport({ left: camera.scrollX, top: camera.scrollY, right: camera.scrollX + camera.width, @@ -1441,7 +1441,7 @@ ${escapedMessage} const jitsiUrl = allProps.get("jitsiUrl") as string|undefined; jitsiFactory.start(roomName, this.playerName, jwt, jitsiConfig, jitsiInterfaceConfig, jitsiUrl); - this.connection.setSilent(true); + this.connection?.setSilent(true); mediaManager.hideGameOverlay(); //permit to stop jitsi when user close iframe diff --git a/front/src/Phaser/Menu/MenuScene.ts b/front/src/Phaser/Menu/MenuScene.ts index 187f98c1..dec04ddc 100644 --- a/front/src/Phaser/Menu/MenuScene.ts +++ b/front/src/Phaser/Menu/MenuScene.ts @@ -91,7 +91,7 @@ export class MenuScene extends Phaser.Scene { this.menuElement.addListener('click'); this.menuElement.on('click', this.onMenuClick.bind(this)); - + worldFullWarningStream.stream.subscribe(() => this.showWorldCapacityWarning()); } @@ -118,7 +118,8 @@ export class MenuScene extends Phaser.Scene { this.closeAll(); this.sideMenuOpened = true; this.menuButton.getChildByID('openMenuButton').innerHTML = 'X'; - if (gameManager.getCurrentGameScene(this).connection && gameManager.getCurrentGameScene(this).connection.isAdmin()) { + const connection = gameManager.getCurrentGameScene(this).connection; + if (connection && connection.isAdmin()) { const adminSection = this.menuElement.getChildByID('adminConsoleSection') as HTMLElement; adminSection.hidden = false; } @@ -134,7 +135,7 @@ export class MenuScene extends Phaser.Scene { ease: 'Power3' }); } - + private showWorldCapacityWarning() { if (!this.warningContainer) { this.warningContainer = new WarningContainer(this); @@ -147,7 +148,7 @@ export class MenuScene extends Phaser.Scene { this.warningContainer = null this.warningContainerTimeout = null }, 120000); - + } private closeSideMenu(): void { diff --git a/front/src/Phaser/Menu/ReportMenu.ts b/front/src/Phaser/Menu/ReportMenu.ts index c5d59f38..e8b20531 100644 --- a/front/src/Phaser/Menu/ReportMenu.ts +++ b/front/src/Phaser/Menu/ReportMenu.ts @@ -7,11 +7,11 @@ export const gameReportRessource = 'resources/html/gameReport.html'; export class ReportMenu extends Phaser.GameObjects.DOMElement { private opened: boolean = false; - + private userId!: number; private userName!: string|undefined; private anonymous: boolean; - + constructor(scene: Phaser.Scene, anonymous: boolean) { super(scene, -2000, -2000); this.anonymous = anonymous; @@ -23,7 +23,7 @@ export class ReportMenu extends Phaser.GameObjects.DOMElement { const textToHide = this.getChildByID('askActionP') as HTMLElement; textToHide.hidden = true; } - + scene.add.existing(this); MenuScene.revealMenusAfterInit(this, gameReportKey); @@ -45,10 +45,10 @@ export class ReportMenu extends Phaser.GameObjects.DOMElement { this.close(); return; } - + this.userId = userId; this.userName = userName; - + const mainEl = this.getChildByID('gameReport') as HTMLElement; this.x = this.getCenteredX(mainEl); this.y = this.getHiddenY(mainEl); @@ -82,7 +82,7 @@ export class ReportMenu extends Phaser.GameObjects.DOMElement { ease: 'Power3' }); } - + //todo: into a parent class? private getCenteredX(mainEl: HTMLElement): number { return window.innerWidth / 4 - mainEl.clientWidth / 2; @@ -93,7 +93,7 @@ export class ReportMenu extends Phaser.GameObjects.DOMElement { private getCenteredY(mainEl: HTMLElement): number { return window.innerHeight / 4 - mainEl.clientHeight / 2; } - + private toggleBlock(): void { !blackListManager.isBlackListed(this.userId) ? blackListManager.blackList(this.userId) : blackListManager.cancelBlackList(this.userId); this.close(); @@ -109,10 +109,10 @@ export class ReportMenu extends Phaser.GameObjects.DOMElement { gamePError.style.display = 'block'; return; } - gameManager.getCurrentGameScene(this.scene).connection.emitReportPlayerMessage( + gameManager.getCurrentGameScene(this.scene).connection?.emitReportPlayerMessage( this.userId, gameTextArea.value ); this.close(); } -} \ No newline at end of file +}