From f68547b7ff4a63f77ba26e09a4f2b561358e7f77 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Mon, 27 Jun 2022 01:08:03 +0200 Subject: [PATCH] Moving live-player-endpoint --- BlueMapWeb | 2 +- package-lock.json | 160 +++++++++++++++-------------- public/live/players | 1 - src/components/Menu/MapButton.vue | 2 +- src/components/Menu/MarkerItem.vue | 2 +- src/js/BlueMapApp.js | 116 +++++++++++++-------- vue.config.js | 10 +- 7 files changed, 162 insertions(+), 131 deletions(-) delete mode 100644 public/live/players diff --git a/BlueMapWeb b/BlueMapWeb index 889d3cf..25c4658 160000 --- a/BlueMapWeb +++ b/BlueMapWeb @@ -1 +1 @@ -Subproject commit 889d3cf94ce760a4c202735c7060df0744346d54 +Subproject commit 25c4658de4c50d9ea83d9f324b2e7cbab36176fe diff --git a/package-lock.json b/package-lock.json index 8cf30b1..65d5156 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1829,63 +1829,6 @@ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dev": true, - "optional": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -1894,28 +1837,6 @@ "requires": { "minipass": "^3.1.1" } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.8.3", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", - "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - } } } }, @@ -12003,6 +11924,87 @@ } } }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.8.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "vue-style-loader": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", diff --git a/public/live/players b/public/live/players deleted file mode 100644 index 9e26dfe..0000000 --- a/public/live/players +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/components/Menu/MapButton.vue b/src/components/Menu/MapButton.vue index 11a59da..5dcdde2 100644 --- a/src/components/Menu/MapButton.vue +++ b/src/components/Menu/MapButton.vue @@ -24,7 +24,7 @@ export default { }, methods: { switchMap(mapId) { - this.$bluemap.switchMap(mapId, true); + this.$bluemap.switchMap(mapId); } } } diff --git a/src/components/Menu/MarkerItem.vue b/src/components/Menu/MarkerItem.vue index c8b7dee..0187a31 100644 --- a/src/components/Menu/MarkerItem.vue +++ b/src/components/Menu/MarkerItem.vue @@ -89,7 +89,7 @@ export default { await this.$bluemap.switchMap(matchingMap.data.id); } - if (follow && cm.controls && cm.controls.followPlayerMarker) { + if (follow && cm.controls && cm.controls.followPlayerMarker && this.marker.visible) { cm.controls.followPlayerMarker(this.marker); } diff --git a/src/js/BlueMapApp.js b/src/js/BlueMapApp.js index efc4a60..702eaa7 100644 --- a/src/js/BlueMapApp.js +++ b/src/js/BlueMapApp.js @@ -77,7 +77,7 @@ export class BlueMapApp { /** @type Map */ this.mapsMap = new Map(); - this.dataUrl = "data/"; + this.dataUrl = "maps/"; this.mainMenu = new MainMenu(); @@ -163,55 +163,68 @@ export class BlueMapApp { } async followPlayerMarkerWorld() { - let player = this.mapViewer.controlsManager.controls ? - this.mapViewer.controlsManager.controls.data.followingPlayer : - false; + /** @type {PlayerLike} */ + let player = this.mapViewer.controlsManager.controls?.data.followingPlayer; if (this.mapViewer.map && player) { - if (player.world !== this.mapViewer.map.data.world){ + if (player.foreign){ - /** @type BlueMapMap */ - let matchingMap = null; - for (let map of this.maps) { - if (map.data.world === player.world) { + let matchingMap = await this.findPlayerMap(player.playerUuid) + if (matchingMap) { + this.mainMenu.closeAll(); + await this.switchMap(matchingMap.data.id, false); + let playerMarker = this.playerMarkerManager.getPlayerMarker(player.playerUuid); + if (playerMarker && this.mapViewer.controlsManager.controls.followPlayerMarker) + this.mapViewer.controlsManager.controls.followPlayerMarker(playerMarker); + } else { + if (this.mapViewer.controlsManager.controls.stopFollowingPlayerMarker) + this.mapViewer.controlsManager.controls.stopFollowingPlayerMarker(); + } + } + } + } + + async findPlayerMap(playerUuid) { + /** @type BlueMapMap */ + let matchingMap = null; + + // search for the map that contains the player + if (this.maps.length < 20) { + for (let map of this.maps) { + let playerData = await this.loadPlayerData(map); + if (!Array.isArray(playerData.players)) continue; + for (let p of playerData.players) { + if (p.uuid === playerUuid && !p.foreign) { matchingMap = map; break; } } - if (!matchingMap) { - if (this.mapViewer.controlsManager.controls.stopFollowingPlayerMarker) - this.mapViewer.controlsManager.controls.stopFollowingPlayerMarker(); - return; - } - - await this.switchMap(matchingMap.data.id); + if (matchingMap) break; } } + + return matchingMap; } /** * @param mapId {String} - * @param resetCameraIfNewWorld {boolean} + * @param resetCamera {boolean} * @returns {Promise} */ - switchMap(mapId, resetCameraIfNewWorld = false) { + async switchMap(mapId, resetCamera = true) { let map = this.mapsMap.get(mapId); if (!map) return Promise.reject(`There is no map with the id "${mapId}" loaded!`); - let oldWorld = this.mapViewer.map ? this.mapViewer.map.data.world : null; - return this.mapViewer.switchMap(map).then(() => { - if (map) { - this.initPlayerMarkerManager(); - this.initMarkerFileManager(); + await this.mapViewer.switchMap(map) - if (resetCameraIfNewWorld && map.data.world !== oldWorld) { - this.resetCamera(); - } - } + if (resetCamera) this.resetCamera(); + this.updatePageAddress(); - this.updatePageAddress(); - }); + await Promise.all([ + this.initPlayerMarkerManager(), + this.initMarkerFileManager() + ]); } resetCamera() { @@ -277,7 +290,7 @@ export class BlueMapApp { return new Promise((resolve, reject) => { let loader = new FileLoader(); loader.setResponseType("json"); - loader.load(this.dataUrl + "settings.json?" + generateCacheHash(), + loader.load("settings.json?" + generateCacheHash(), resolve, () => {}, () => reject("Failed to load the settings.json!") @@ -285,17 +298,37 @@ export class BlueMapApp { }); } - initPlayerMarkerManager() { - if (!this.mapViewer.map) return; + /** + * @param map {BlueMapMap} + * @returns {Promise} + */ + loadPlayerData(map) { + return new Promise((resolve, reject) => { + let loader = new FileLoader(); + loader.setResponseType("json"); + loader.load(map.data.dataUrl + "live/players?" + generateCacheHash(), + fileData => { + if (!fileData) reject(`Failed to parse '${this.fileUrl}'!`); + else resolve(fileData); + }, + () => {}, + () => reject(`Failed to load '${this.fileUrl}'!`) + ) + }); + } - if (this.playerMarkerManager) { - this.playerMarkerManager.worldId = this.mapViewer.map.data.world; - } else { - this.playerMarkerManager = new PlayerMarkerManager(this.mapViewer.markers, "live/players", this.mapViewer.map.data.world, this.events); + initPlayerMarkerManager() { + if (this.playerMarkerManager){ + this.playerMarkerManager.clear(); + this.playerMarkerManager.dispose() } + const map = this.mapViewer.map; + if (!map) return; + + this.playerMarkerManager = new PlayerMarkerManager(this.mapViewer.markers, map.data.dataUrl + "live/players", this.events); this.playerMarkerManager.setAutoUpdateInterval(0); - this.playerMarkerManager.update() + return this.playerMarkerManager.update() .then(() => { this.playerMarkerManager.setAutoUpdateInterval(1000); }) @@ -312,10 +345,11 @@ export class BlueMapApp { this.markerFileManager.dispose(); } - if (!this.mapViewer.map) return; + const map = this.mapViewer.map; + if (!map) return; - this.markerFileManager = new MarkerFileManager(this.mapViewer.markers, "data/markers.json", this.mapViewer.map.data.id, this.events); - this.markerFileManager.update() + this.markerFileManager = new MarkerFileManager(this.mapViewer.markers, map.data.dataUrl + "markers.json", map.data.id, this.events); + return this.markerFileManager.update() .then(() => { this.markerFileManager.setAutoUpdateInterval(1000 * 10); }) @@ -586,7 +620,7 @@ export class BlueMapApp { } loadPageAddress = async () => { - let hash = window.location.hash.substring(1) || this.settings.startLocation; + let hash = window.location.hash?.substring(1) || this.settings.startLocation || ""; let values = hash.split(":"); if (values.length !== 10) return false; diff --git a/vue.config.js b/vue.config.js index 3372e85..29c3448 100644 --- a/vue.config.js +++ b/vue.config.js @@ -5,18 +5,14 @@ module.exports = { publicPath: './', devServer: { proxy: { - '/data': { - target: 'https://bluecolored.de/bluemap-dev', + '/maps': { + target: 'https://localhost:8100', changeOrigin: true, }, '/assets/playerheads': { target: 'https://bluecolored.de/bluemap', changeOrigin: true, - }, - '/live': { - target: 'https://bluecolored.de/bluemap', - changeOrigin: true, - }, + } } } } \ No newline at end of file