From e87c0a07a41004fa86d50333629f2fd43bb7bd3b Mon Sep 17 00:00:00 2001 From: Hanusiak Piotr Date: Thu, 20 Jan 2022 15:10:54 +0100 Subject: [PATCH] moveTo parameter working if layer is found --- front/src/Phaser/Game/GameMap.ts | 33 +++++++++++++++++++++++++++++- front/src/Phaser/Game/GameScene.ts | 23 ++++++++++++++++----- front/src/Url/UrlManager.ts | 5 +++-- front/src/Utils/MathUtils.ts | 4 ++++ 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/front/src/Phaser/Game/GameMap.ts b/front/src/Phaser/Game/GameMap.ts index fc16110f..54f91866 100644 --- a/front/src/Phaser/Game/GameMap.ts +++ b/front/src/Phaser/Game/GameMap.ts @@ -1,4 +1,10 @@ -import type { ITiledMap, ITiledMapLayer, ITiledMapObject, ITiledMapProperty } from "../Map/ITiledMap"; +import type { + ITiledMap, + ITiledMapLayer, + ITiledMapObject, + ITiledMapProperty, + ITiledMapTileLayer, +} from "../Map/ITiledMap"; import { flattenGroupLayersMap } from "../Map/LayersFlattener"; import TilemapLayer = Phaser.Tilemaps.TilemapLayer; import { DEPTH_OVERLAY_INDEX } from "./DepthIndexes"; @@ -291,6 +297,31 @@ export class GameMap { } } + public getRandomPositionFromLayer(layerName: string): { x: number; y: number } { + const layer = this.findLayer(layerName) as ITiledMapTileLayer; + if (!layer) { + throw new Error(`No layer "${layerName}" was found`); + } + const tiles = layer.data; + if (!tiles) { + throw new Error(`No tiles in "${layerName}" were found`); + } + if (typeof tiles === "string") { + throw new Error("The content of a JSON map must be filled as a JSON array, not as a string"); + } + const possiblePositions: { x: number; y: number }[] = []; + tiles.forEach((objectKey: number, key: number) => { + if (objectKey === 0) { + return; + } + possiblePositions.push({ x: key % layer.width, y: Math.floor(key / layer.width) }); + }); + if (possiblePositions.length > 0) { + return MathUtils.randomFromArray(possiblePositions); + } + throw new Error("No possible position found"); + } + 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 739e195d..8c5df9b7 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -559,6 +559,12 @@ export class GameScene extends DirtyScene { .catch((e) => console.error(e)); } + this.pathfindingManager = new PathfindingManager( + this, + this.gameMap.getCollisionsGrid(), + this.gameMap.getTileDimensions() + ); + //notify game manager can to create currentUser in map this.createCurrentPlayer(); this.removeAllRemotePlayers(); //cleanup the list of remote players in case the scene was rebooted @@ -569,11 +575,6 @@ export class GameScene extends DirtyScene { waScaleManager ); - this.pathfindingManager = new PathfindingManager( - this, - this.gameMap.getCollisionsGrid(), - this.gameMap.getTileDimensions() - ); biggestAvailableAreaStore.recompute(); this.cameraManager.startFollowPlayer(this.CurrentPlayer); @@ -1725,6 +1726,18 @@ ${escapedMessage} this.connection?.emitEmoteEvent(emoteKey); analyticsClient.launchEmote(emoteKey); }); + const moveToParam = urlManager.getHashParameter("moveTo"); + if (moveToParam) { + 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) { if (err instanceof TextureError) { gameManager.leaveGame(SelectCharacterSceneName, new SelectCharacterScene()); diff --git a/front/src/Url/UrlManager.ts b/front/src/Url/UrlManager.ts index c6e463e4..3be17f08 100644 --- a/front/src/Url/UrlManager.ts +++ b/front/src/Url/UrlManager.ts @@ -49,12 +49,13 @@ class UrlManager { return hash.length > 1 ? hash.substring(1) : null; } - public getHashParameters(): Record { - return window.location.hash.split("&").reduce((res: Record, item: string) => { + public getHashParameter(name: string): string | undefined { + const parameters = window.location.hash.split("&").reduce((res: Record, item: string) => { const parts = item.split("="); res[parts[0]] = parts[1]; return res; }, {}); + return parameters[name]; } pushStartLayerNameToUrl(startLayerName: string): void { diff --git a/front/src/Utils/MathUtils.ts b/front/src/Utils/MathUtils.ts index c2fc88a2..fc055d11 100644 --- a/front/src/Utils/MathUtils.ts +++ b/front/src/Utils/MathUtils.ts @@ -31,4 +31,8 @@ export class MathUtils { const distance = Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2); return squared ? Math.sqrt(distance) : distance; } + + public static randomFromArray(array: T[]): T { + return array[Math.floor(Math.random() * array.length)]; + } }