From fe570c9117926707d7bbd550cba2fa07bca9e747 Mon Sep 17 00:00:00 2001 From: Hanusiak Piotr Date: Wed, 9 Feb 2022 10:17:31 +0100 Subject: [PATCH] moveTo object position --- front/src/Phaser/Game/GameMap.ts | 4 +++ front/src/Phaser/Game/GameScene.ts | 49 ++++++++++++++++++------------ maps/tests/move_to.json | 33 ++++++++++++++++++-- 3 files changed, 65 insertions(+), 21 deletions(-) diff --git a/front/src/Phaser/Game/GameMap.ts b/front/src/Phaser/Game/GameMap.ts index 7e9a486d..8e377ae7 100644 --- a/front/src/Phaser/Game/GameMap.ts +++ b/front/src/Phaser/Game/GameMap.ts @@ -323,6 +323,10 @@ export class GameMap { throw new Error("No possible position found"); } + public getObjectWithName(name: string): ITiledMapObject | undefined { + return this.tiledObjects.find((object) => object.name === name); + } + private getLayersByKey(key: number): Array { return this.flatLayers.filter((flatLayer) => flatLayer.type === "tilelayer" && flatLayer.data[key] !== 0); } diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 9b758a45..44992d85 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -568,6 +568,8 @@ export class GameScene extends DirtyScene { this.createCurrentPlayer(); this.removeAllRemotePlayers(); //cleanup the list of remote players in case the scene was rebooted + this.tryMovePlayerWithMoveToParameter(); + this.cameraManager = new CameraManager( this, { x: this.Map.widthInPixels, y: this.Map.heightInPixels }, @@ -1460,9 +1462,9 @@ ${escapedMessage} }); iframeListener.registerAnswerer("movePlayerTo", async (message) => { - const index = this.getGameMap().getTileIndexAt(message.x, message.y); - const startTile = this.getGameMap().getTileIndexAt(this.CurrentPlayer.x, this.CurrentPlayer.y); - const path = await this.getPathfindingManager().findPath(startTile, index, true, true); + const startTileIndex = this.getGameMap().getTileIndexAt(this.CurrentPlayer.x, this.CurrentPlayer.y); + const destinationTileIndex = this.getGameMap().getTileIndexAt(message.x, message.y); + const path = await this.getPathfindingManager().findPath(startTileIndex, destinationTileIndex, true, true); path.shift(); if (path.length === 0) { throw new Error("no path available"); @@ -1626,6 +1628,31 @@ ${escapedMessage} this.MapPlayersByKey.clear(); } + private tryMovePlayerWithMoveToParameter(): void { + const moveToParam = urlManager.getHashParameter("moveTo"); + if (moveToParam) { + try { + const destinationObject = this.gameMap.getObjectWithName(moveToParam); + let endPos; + if (destinationObject) { + endPos = this.gameMap.getTileIndexAt(destinationObject.x, destinationObject.y); + } else { + endPos = this.gameMap.getRandomPositionFromLayer(moveToParam); + } + this.pathfindingManager + .findPath(this.gameMap.getTileIndexAt(this.CurrentPlayer.x, this.CurrentPlayer.y), endPos) + .then((path) => { + if (path && path.length > 0) { + this.CurrentPlayer.setPathToFollow(path).catch((reason) => console.warn(reason)); + } + }) + .catch((reason) => console.warn(reason)); + } catch (err) { + console.warn(`Cannot proceed with moveTo command:\n\t-> ${err}`); + } + } + } + private getExitUrl(layer: ITiledMapLayer): string | undefined { return this.getProperty(layer, GameMapProperties.EXIT_URL) as string | undefined; } @@ -1748,22 +1775,6 @@ ${escapedMessage} this.connection?.emitEmoteEvent(emoteKey); analyticsClient.launchEmote(emoteKey); }); - const moveToParam = urlManager.getHashParameter("moveTo"); - if (moveToParam) { - try { - const endPos = this.gameMap.getRandomPositionFromLayer(moveToParam); - this.pathfindingManager - .findPath(this.gameMap.getTileIndexAt(this.CurrentPlayer.x, this.CurrentPlayer.y), endPos) - .then((path) => { - if (path && path.length > 0) { - this.CurrentPlayer.setPathToFollow(path).catch((reason) => console.warn(reason)); - } - }) - .catch((reason) => console.warn(reason)); - } catch (err) { - console.warn(`Cannot proceed with moveTo command:\n\t-> ${err}`); - } - } } catch (err) { if (err instanceof TextureError) { gameManager.leaveGame(SelectCharacterSceneName, new SelectCharacterScene()); diff --git a/maps/tests/move_to.json b/maps/tests/move_to.json index 796a9d46..6776bd6b 100644 --- a/maps/tests/move_to.json +++ b/maps/tests/move_to.json @@ -3,7 +3,7 @@ "infinite":false, "layers":[ { - "data":[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "data":[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "height":10, "id":1, "name":"floor", @@ -204,6 +204,35 @@ "width":92.7120717279925, "x":233.848901257569, "y":135.845612785282 + }, + { + "height":0, + "id":9, + "name":"destination", + "point":true, + "rotation":0, + "type":"", + "visible":true, + "width":0, + "x":207.918025151374, + "y":243.31625523987 + }, + { + "height":45.0829063809967, + "id":10, + "name":"", + "rotation":0, + "text": + { + "halign":"center", + "text":"destination object", + "wrap":true + }, + "type":"", + "visible":true, + "width":83, + "x":167.26, + "y":254.682580344667 }], "opacity":1, "type":"objectgroup", @@ -212,7 +241,7 @@ "y":0 }], "nextlayerid":11, - "nextobjectid":9, + "nextobjectid":11, "orientation":"orthogonal", "renderorder":"right-down", "tiledversion":"1.7.2",