From 151904c3437ee787e487d61f38c1fc3155a0ce92 Mon Sep 17 00:00:00 2001 From: James Lyne Date: Mon, 23 Nov 2020 12:13:28 +0000 Subject: [PATCH] The map kinda works --- package-lock.json | 682 ++++++++++++++++---- package.json | 8 +- public/index.html | 5 +- src/App.vue | 85 ++- src/api.ts | 127 ++++ {public => src/assets}/css/dynmap_style.css | 11 +- src/assets/css/images/layers.png | Bin 0 -> 973 bytes src/assets/css/images/link.png | Bin 0 -> 649 bytes src/assets/css/images/marker-icon.png | Bin 0 -> 1747 bytes src/assets/css/images/marker-icon@2x.png | Bin 0 -> 4033 bytes src/assets/css/images/marker-shadow.png | Bin 0 -> 797 bytes src/assets/css/images/marker.png | Bin 0 -> 2519 bytes src/assets/css/images/popup-close.png | Bin 0 -> 1125 bytes src/assets/css/images/zoom-in.png | Bin 0 -> 963 bytes src/assets/css/images/zoom-out.png | Bin 0 -> 959 bytes {public => src/assets}/css/rtgame.css | 0 src/assets/images/BiomeKey.png | Bin 0 -> 27727 bytes src/assets/images/armor.png | Bin 0 -> 213 bytes src/assets/images/armor_depleted.png | Bin 0 -> 192 bytes src/assets/images/blank.png | Bin 0 -> 167 bytes src/assets/images/block_nether_flat.png | Bin 0 -> 2620 bytes src/assets/images/block_nether_surface.png | Bin 0 -> 340 bytes src/assets/images/block_other.png | Bin 0 -> 330 bytes src/assets/images/block_skylands.png | Bin 0 -> 993 bytes src/assets/images/block_the_end_flat.png | Bin 0 -> 2089 bytes src/assets/images/block_the_end_surface.png | Bin 0 -> 1062 bytes src/assets/images/block_world_biome.png | Bin 0 -> 1092 bytes src/assets/images/block_world_cave.png | Bin 0 -> 339 bytes src/assets/images/block_world_flat.png | Bin 0 -> 387 bytes src/assets/images/block_world_surface.png | Bin 0 -> 342 bytes src/assets/images/book.png | Bin 0 -> 829 bytes src/assets/images/cave_off.png | Bin 0 -> 1134 bytes src/assets/images/cave_on.png | Bin 0 -> 868 bytes src/assets/images/chat_bubble.png | Bin 0 -> 395 bytes src/assets/images/chat_cursor.png | Bin 0 -> 261 bytes src/assets/images/clock_day.png | Bin 0 -> 357 bytes src/assets/images/clock_night.png | Bin 0 -> 360 bytes src/assets/images/compass.png | Bin 0 -> 5203 bytes src/assets/images/compass_E.png | Bin 0 -> 4323 bytes src/assets/images/compass_N.png | Bin 0 -> 4187 bytes src/assets/images/compass_NE.png | Bin 0 -> 5165 bytes src/assets/images/compass_NW.png | Bin 0 -> 5133 bytes src/assets/images/compass_SW.png | Bin 0 -> 5183 bytes src/assets/images/compass_W.png | Bin 0 -> 4205 bytes src/assets/images/compass_alt.png | Bin 0 -> 802 bytes src/assets/images/compass_flat.png | Bin 0 -> 1844 bytes src/assets/images/dynmap.ico | Bin 0 -> 1150 bytes src/assets/images/follow_off.png | Bin 0 -> 377 bytes src/assets/images/follow_on.png | Bin 0 -> 376 bytes src/assets/images/heart.png | Bin 0 -> 198 bytes src/assets/images/heart_depleted.png | Bin 0 -> 183 bytes src/assets/images/home.png | Bin 0 -> 428 bytes src/assets/images/list_off.png | Bin 0 -> 351 bytes src/assets/images/list_on.png | Bin 0 -> 360 bytes src/assets/images/moon.png | Bin 0 -> 3248 bytes src/assets/images/player.png | Bin 0 -> 328 bytes src/assets/images/player_death.png | Bin 0 -> 404 bytes src/assets/images/player_face.png | Bin 0 -> 459 bytes src/assets/images/player_follow_off.png | Bin 0 -> 361 bytes src/assets/images/player_follow_on.gif | Bin 0 -> 332 bytes src/assets/images/player_follow_on.png | Bin 0 -> 355 bytes src/assets/images/player_travel.png | Bin 0 -> 454 bytes src/assets/images/scrolldown.png | Bin 0 -> 1019 bytes src/assets/images/scrollup.png | Bin 0 -> 1005 bytes src/assets/images/server.png | Bin 0 -> 368 bytes src/assets/images/sidebar_hint.png | Bin 0 -> 271 bytes src/assets/images/sign.png | Bin 0 -> 681 bytes src/assets/images/sign_home.png | Bin 0 -> 407 bytes src/assets/images/sign_sign.png | Bin 0 -> 431 bytes src/assets/images/sign_sign_alt.png | Bin 0 -> 431 bytes src/assets/images/sign_warp.png | Bin 0 -> 435 bytes src/assets/images/spawn.png | Bin 0 -> 943 bytes src/assets/images/sun.png | Bin 0 -> 5319 bytes src/assets/images/warp.png | Bin 0 -> 1189 bytes src/assets/images/weather_stormy.png | Bin 0 -> 1285 bytes src/assets/images/weather_stormy_day.png | Bin 0 -> 2665 bytes src/assets/images/weather_stormy_night.png | Bin 0 -> 2968 bytes src/assets/images/weather_sunny.png | Bin 0 -> 905 bytes src/assets/images/weather_sunny_day.png | Bin 0 -> 2385 bytes src/assets/images/weather_sunny_night.png | Bin 0 -> 2273 bytes src/assets/images/weather_thunder.png | Bin 0 -> 627 bytes src/assets/images/weather_thunder_day.png | Bin 0 -> 2818 bytes src/assets/images/weather_thunder_night.png | Bin 0 -> 2898 bytes src/assets/images/window_close.png | Bin 0 -> 374 bytes src/assets/images/window_close_hover.png | Bin 0 -> 355 bytes src/assets/images/window_open.png | Bin 0 -> 326 bytes src/assets/images/window_pinned.png | Bin 0 -> 299 bytes src/assets/images/window_pinned_hover.png | Bin 0 -> 290 bytes src/assets/images/window_unpinned.png | Bin 0 -> 326 bytes src/assets/images/zoom_in.png | Bin 0 -> 366 bytes src/assets/images/zoom_out.png | Bin 0 -> 336 bytes src/components/Leaflet.vue | 50 ++ src/components/Map.vue | 19 - src/components/PlayerList.vue | 49 +- src/components/PlayerListItem.vue | 24 + src/components/Sidebar.vue | 156 +---- src/components/WorldList.vue | 34 + src/components/WorldListItem.vue | 62 ++ src/components/map/layer/MapLayer.vue | 85 +++ src/components/map/layer/PlayersLayer.vue | 41 ++ src/components/map/marker/PlayerMarker.vue | 33 + src/dynmap.d.ts | 154 +++++ src/leaflet/control/CoordinatesControl.js | 108 ++++ src/leaflet/control/LinkControl.js | 51 ++ src/leaflet/control/LogoControl.js | 50 ++ src/leaflet/mapType/HDMapType.js | 47 ++ src/leaflet/marker/PlayerMarker.js | 156 +++++ src/leaflet/projection/DynmapProjection.js | 15 + src/leaflet/projection/HDProjection.js | 25 + src/leaflet/tileLayer/DynmapTileLayer.js | 128 ++++ src/main.ts | 13 +- src/store.ts | 20 - src/store/index.ts | 326 ++++++++++ src/vuex.d.ts | 9 + 114 files changed, 2202 insertions(+), 371 deletions(-) rename {public => src/assets}/css/dynmap_style.css (99%) create mode 100644 src/assets/css/images/layers.png create mode 100644 src/assets/css/images/link.png create mode 100644 src/assets/css/images/marker-icon.png create mode 100644 src/assets/css/images/marker-icon@2x.png create mode 100644 src/assets/css/images/marker-shadow.png create mode 100644 src/assets/css/images/marker.png create mode 100644 src/assets/css/images/popup-close.png create mode 100644 src/assets/css/images/zoom-in.png create mode 100644 src/assets/css/images/zoom-out.png rename {public => src/assets}/css/rtgame.css (100%) create mode 100644 src/assets/images/BiomeKey.png create mode 100644 src/assets/images/armor.png create mode 100644 src/assets/images/armor_depleted.png create mode 100644 src/assets/images/blank.png create mode 100644 src/assets/images/block_nether_flat.png create mode 100644 src/assets/images/block_nether_surface.png create mode 100644 src/assets/images/block_other.png create mode 100644 src/assets/images/block_skylands.png create mode 100644 src/assets/images/block_the_end_flat.png create mode 100644 src/assets/images/block_the_end_surface.png create mode 100644 src/assets/images/block_world_biome.png create mode 100644 src/assets/images/block_world_cave.png create mode 100644 src/assets/images/block_world_flat.png create mode 100644 src/assets/images/block_world_surface.png create mode 100644 src/assets/images/book.png create mode 100644 src/assets/images/cave_off.png create mode 100644 src/assets/images/cave_on.png create mode 100644 src/assets/images/chat_bubble.png create mode 100644 src/assets/images/chat_cursor.png create mode 100644 src/assets/images/clock_day.png create mode 100644 src/assets/images/clock_night.png create mode 100644 src/assets/images/compass.png create mode 100644 src/assets/images/compass_E.png create mode 100644 src/assets/images/compass_N.png create mode 100644 src/assets/images/compass_NE.png create mode 100644 src/assets/images/compass_NW.png create mode 100644 src/assets/images/compass_SW.png create mode 100644 src/assets/images/compass_W.png create mode 100644 src/assets/images/compass_alt.png create mode 100644 src/assets/images/compass_flat.png create mode 100644 src/assets/images/dynmap.ico create mode 100644 src/assets/images/follow_off.png create mode 100644 src/assets/images/follow_on.png create mode 100644 src/assets/images/heart.png create mode 100644 src/assets/images/heart_depleted.png create mode 100644 src/assets/images/home.png create mode 100644 src/assets/images/list_off.png create mode 100644 src/assets/images/list_on.png create mode 100644 src/assets/images/moon.png create mode 100644 src/assets/images/player.png create mode 100644 src/assets/images/player_death.png create mode 100644 src/assets/images/player_face.png create mode 100644 src/assets/images/player_follow_off.png create mode 100644 src/assets/images/player_follow_on.gif create mode 100644 src/assets/images/player_follow_on.png create mode 100644 src/assets/images/player_travel.png create mode 100644 src/assets/images/scrolldown.png create mode 100644 src/assets/images/scrollup.png create mode 100644 src/assets/images/server.png create mode 100644 src/assets/images/sidebar_hint.png create mode 100644 src/assets/images/sign.png create mode 100644 src/assets/images/sign_home.png create mode 100644 src/assets/images/sign_sign.png create mode 100644 src/assets/images/sign_sign_alt.png create mode 100644 src/assets/images/sign_warp.png create mode 100644 src/assets/images/spawn.png create mode 100644 src/assets/images/sun.png create mode 100644 src/assets/images/warp.png create mode 100644 src/assets/images/weather_stormy.png create mode 100644 src/assets/images/weather_stormy_day.png create mode 100644 src/assets/images/weather_stormy_night.png create mode 100644 src/assets/images/weather_sunny.png create mode 100644 src/assets/images/weather_sunny_day.png create mode 100644 src/assets/images/weather_sunny_night.png create mode 100644 src/assets/images/weather_thunder.png create mode 100644 src/assets/images/weather_thunder_day.png create mode 100644 src/assets/images/weather_thunder_night.png create mode 100644 src/assets/images/window_close.png create mode 100644 src/assets/images/window_close_hover.png create mode 100644 src/assets/images/window_open.png create mode 100644 src/assets/images/window_pinned.png create mode 100644 src/assets/images/window_pinned_hover.png create mode 100644 src/assets/images/window_unpinned.png create mode 100644 src/assets/images/zoom_in.png create mode 100644 src/assets/images/zoom_out.png create mode 100644 src/components/Leaflet.vue delete mode 100644 src/components/Map.vue create mode 100644 src/components/PlayerListItem.vue create mode 100644 src/components/WorldList.vue create mode 100644 src/components/WorldListItem.vue create mode 100644 src/components/map/layer/MapLayer.vue create mode 100644 src/components/map/layer/PlayersLayer.vue create mode 100644 src/components/map/marker/PlayerMarker.vue create mode 100644 src/dynmap.d.ts create mode 100644 src/leaflet/control/CoordinatesControl.js create mode 100644 src/leaflet/control/LinkControl.js create mode 100644 src/leaflet/control/LogoControl.js create mode 100644 src/leaflet/mapType/HDMapType.js create mode 100644 src/leaflet/marker/PlayerMarker.js create mode 100644 src/leaflet/projection/DynmapProjection.js create mode 100644 src/leaflet/projection/HDProjection.js create mode 100644 src/leaflet/tileLayer/DynmapTileLayer.js delete mode 100644 src/store.ts create mode 100644 src/store/index.ts create mode 100644 src/vuex.d.ts diff --git a/package-lock.json b/package-lock.json index ec3604b..3735184 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1047,6 +1047,74 @@ "to-fast-properties": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", + "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -1107,12 +1175,40 @@ "glob-to-regexp": "^0.3.0" } }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + } + } + }, "@nodelib/fs.stat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, "@soda/friendly-errors-webpack-plugin": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz", @@ -1240,12 +1336,6 @@ "@types/node": "*" } }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, "@types/express": { "version": "4.17.9", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.9.tgz", @@ -1269,6 +1359,12 @@ "@types/range-parser": "*" } }, + "@types/geojson": { + "version": "7946.0.7", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", + "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==", + "dev": true + }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -1305,6 +1401,15 @@ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, + "@types/leaflet": { + "version": "1.5.19", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.5.19.tgz", + "integrity": "sha512-ZAKqfvdU/+KFoCpf8aUba09F8mfSc8R2esq++Cha3E2DgwS5K/I/4eJ+0JylrVHZivgY7PSAeXFv/izP+81/MQ==", + "dev": true, + "requires": { + "@types/geojson": "*" + } + }, "@types/mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", @@ -1460,90 +1565,16 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.1.tgz", + "integrity": "sha512-d7LeQ7dbUrIv5YVFNzGgaW3IQKMmnmKFneRWagRlGYOSfLJVaRbj/FrBNOBC1a3tVO+TgNq1GbHvRtg1kwL0FQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/experimental-utils": "4.8.1", + "@typescript-eslint/scope-manager": "4.8.1", + "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - }, - "dependencies": { - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", "semver": "^7.3.2", "tsutils": "^3.17.1" }, @@ -1565,6 +1596,221 @@ } } }, + "@typescript-eslint/experimental-utils": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.8.1.tgz", + "integrity": "sha512-WigyLn144R3+lGATXW4nNcDJ9JlTkG8YdBWHkDlN0lC3gUGtDi7Pe3h5GPvFKMcRz8KbZpm9FJV9NTW8CpRHpg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.8.1", + "@typescript-eslint/types": "4.8.1", + "@typescript-eslint/typescript-estree": "4.8.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.8.1.tgz", + "integrity": "sha512-QND8XSVetATHK9y2Ltc/XBl5Ro7Y62YuZKnPEwnNPB8E379fDsvzJ1dMJ46fg/VOmk0hXhatc+GXs5MaXuL5Uw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.8.1", + "@typescript-eslint/types": "4.8.1", + "@typescript-eslint/typescript-estree": "4.8.1", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.8.1.tgz", + "integrity": "sha512-r0iUOc41KFFbZdPAdCS4K1mXivnSZqXS5D9oW+iykQsRlTbQRfuFRSW20xKDdYiaCoH+SkSLeIF484g3kWzwOQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.8.1", + "@typescript-eslint/visitor-keys": "4.8.1" + } + }, + "@typescript-eslint/types": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.8.1.tgz", + "integrity": "sha512-ave2a18x2Y25q5K05K/U3JQIe2Av4+TNi/2YuzyaXLAsDx6UZkz1boZ7nR/N6Wwae2PpudTZmHFXqu7faXfHmA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.8.1.tgz", + "integrity": "sha512-bJ6Fn/6tW2g7WIkCWh3QRlaSU7CdUUK52shx36/J7T5oTQzANvi6raoTsbwGM11+7eBbeem8hCCKbyvAc0X3sQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.8.1", + "@typescript-eslint/visitor-keys": "4.8.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.8.1.tgz", + "integrity": "sha512-3nrwXFdEYALQh/zW8rFwP4QltqsanCDz4CwWMPiIZmwlk9GlvBeueEIbq05SEq4ganqM0g9nh02xXgv5XI3PeQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.8.1", + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + } + } + }, "@vue/babel-helper-vue-jsx-merge-props": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", @@ -4984,6 +5230,23 @@ } } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + } + } + }, "entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", @@ -5066,22 +5329,24 @@ "dev": true }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.14.0.tgz", + "integrity": "sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.1", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -5090,26 +5355,75 @@ "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", + "levn": "^0.4.1", + "lodash": "^4.17.19", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": 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, + "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 + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -5120,6 +5434,31 @@ "estraverse": "^4.1.1" } }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -5129,6 +5468,12 @@ "type-fest": "^0.8.1" } }, + "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 + }, "import-fresh": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", @@ -5139,6 +5484,12 @@ "resolve-from": "^4.0.0" } }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -5146,18 +5497,33 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" } }, "type-fest": { @@ -5165,6 +5531,15 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -5221,9 +5596,9 @@ } }, "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -5644,6 +6019,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastq": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -7443,13 +7827,13 @@ "dev": true }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "lines-and-columns": { @@ -8161,6 +8545,12 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true }, + "normalize-scss": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/normalize-scss/-/normalize-scss-7.0.1.tgz", + "integrity": "sha512-qj16bWnYs+9/ac29IgGjySg4R5qQTp1lXfm7ApFOZNVBYFY8RZ3f8+XQNDDLHeDtI3Ba7Jj4+LuPgz9v/fne2A==", + "dev": true + }, "normalize-url": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", @@ -8400,17 +8790,17 @@ } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "ora": { @@ -9362,9 +9752,9 @@ "dev": true }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prepend-http": { @@ -9667,9 +10057,9 @@ } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "regexpu-core": { @@ -9890,6 +10280,12 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -9927,6 +10323,12 @@ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -11321,12 +11723,12 @@ "dev": true }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-fest": { diff --git a/package.json b/package.json index 9f3d515..4edb8e2 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,9 @@ "vue-class-component": "^8.0.0-0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^2.33.0", - "@typescript-eslint/parser": "^2.33.0", + "@types/leaflet": "^1.5.19", + "@typescript-eslint/eslint-plugin": "^4.1.0", + "@typescript-eslint/parser": "^4.1.0", "@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-eslint": "~4.5.0", "@vue/cli-plugin-typescript": "^4.5.9", @@ -23,9 +24,10 @@ "@vue/eslint-config-typescript": "^5.0.2", "axios": "^0.21.0", "babel-eslint": "^10.1.0", - "eslint": "^6.7.2", + "eslint": "^7.5.0", "eslint-plugin-vue": "^7.0.0-0", "leaflet": "^1.7.1", + "normalize-scss": "^7.0.1", "sass": "^1.29.0", "sass-loader": "^10.1.0", "typescript": "~3.9.3", diff --git a/public/index.html b/public/index.html index 9b080c8..0e40cc6 100644 --- a/public/index.html +++ b/public/index.html @@ -13,10 +13,6 @@ - - - - @@ -24,6 +20,7 @@ We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.
+ diff --git a/src/App.vue b/src/App.vue index 0120df7..6f4dec4 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,27 +1,76 @@ diff --git a/src/api.ts b/src/api.ts index a552f58..d9fe51f 100644 --- a/src/api.ts +++ b/src/api.ts @@ -1,2 +1,129 @@ import axios from 'axios'; +import { + DynmapConfigurationResponse, DynmapMap, DynmapMessageConfig, + DynmapPlayer, + DynmapServerConfig, + DynmapUpdateResponse, + DynmapWorld +} from "@/dynmap"; +export default { + getConfiguration(): Promise { + return axios.get(window.config.url.configuration).then((response): DynmapConfigurationResponse => { + const data = response.data, + config: DynmapServerConfig = { + version: data.dynmapversion || '', + allowChat: data.allowwebchat || false, + chatRequiresLogin: data['webchat-requires-login'] || false, + chatInterval: data['webchat-interval'] || 5, + defaultMap: data.defaultmap || undefined, + defaultWorld: data.defaultworld || undefined, + defaultZoom: data.defaultZoom || 0, + followMap: data.followmap || undefined, + followZoom: data.followzoom || 0, + updateInterval: data.updaterate || 3000, + showLayerControl: data.showlayercontrol || true, + title: data.title || 'Dynmap', + loginEnabled: data['login-enabled'] || false, + loginRequired: data.loginrequired || false, + maxPlayers: data.maxcount || 0, + hash: data.confighash || 0, + }, + messages: DynmapMessageConfig = { + chatNotAllowed: data['msg-chatnotallowed'] || '', + chatRequiresLogin: data['msg-chatrequireslogin'] || '', + chatCooldown: data.spammessage || '', + mapTypes: data['msg-maptypes'] || '', + players: data['msg-players'] || '', + playerJoin: data.joinmessage || '', + playerQuit: data.quitmessage || '', + anonymousJoin: data['msg-hiddennamejoin'] || '', + anonymousQuit: data['msg-hiddennamequit'] || '', + }, + worlds: Array = []; + + (data.worlds || []).forEach((world: any) => { + const maps: Array = []; + + (world.maps || []).forEach((map: any) => { + maps.push({ + world: world.name, + background: map.background || '#000000', + backgroundDay: map.backgroundday || '#000000', + backgroundNight: map.backgroundnight || '#000000', + compassView: map.compassView || 'S', + icon: map.icon || undefined, + imageFormat: map.imageFormat || 'png', + name: map.name || '(Unnamed map)', + nightAndDay: map.nightandday || false, + prefix: map.prefix || '', + protected: map.protected || false, + title: map.title || '', + type: map.type || 'HDMapType', + mapToWorld: map.maptoworld || [0, 0, 0, 0, 0, 0, 0, 0, 0], + worldToMap: map.worldtomap || [0, 0, 0, 0, 0, 0, 0, 0, 0], + nativeZoomLevels: map.mapzoomout || 1, + extraZoomLevels: map.mapzoomin || 0, + }); + }); + + worlds.push({ + seaLevel: world.sealevel || 64, + name: world.name || '(Unnamed world)', + protected: world.protected || false, + title: world.title || '', + height: world.height || 256, + center: { + x: world.center.x || 0, + y: world.center.y || 0, + z: world.center.z || 0 + }, + maps, + }) + }); + + return { + config, + messages, + worlds, + } + }); + }, + + getUpdate(requestId: number, world: string, timestamp: number): Promise { + let url = window.config.url.update; + url = url.replace('{world}', world); + url = url.replace('{timestamp}', timestamp.toString()); + + return axios.get(url).then((response): DynmapUpdateResponse => { + const data = response.data, + players: Array = []; + + (data.players || []).forEach((player: any) => { + players.push({ + account: player.account || "", + health: player.health || 0, + armor: player.armor || 0, + name: player.name || "Steve", + sort: player.sort || 0, + location: { + x: player.x || 0, + y: player.y || 0, + z: player.z || 0, + world: player.world || undefined, + } + }); + }); + + return { + timeOfDay: data.servertime || 0, + thundering: data.isThundering || false, + raining: data.hasStorm || false, + playerCount: data.count || 0, + configHash: data.configHash || 0, + timestamp: data.timestamp || 0, + players, + } + }); + } +} diff --git a/public/css/dynmap_style.css b/src/assets/css/dynmap_style.css similarity index 99% rename from public/css/dynmap_style.css rename to src/assets/css/dynmap_style.css index 3bdc79b..6baf348 100644 --- a/public/css/dynmap_style.css +++ b/src/assets/css/dynmap_style.css @@ -4,6 +4,10 @@ border: 1px solid red; }*/ +html, body { + height: 100%; +} + /******************* * Attribution placement */ @@ -15,6 +19,11 @@ * Page setup */ + +.dynmap { + height: 100%; +} + .dynmap .map .tile img, img { image-rendering: -moz-crisp-edges; image-rendering: pixelated; @@ -206,7 +215,7 @@ margin-right: 0px; } - .dynmap .sidebar < .hitbar:hover { + .dynmap .sidebar > .hitbar:hover { margin-right: 0px; } diff --git a/src/assets/css/images/layers.png b/src/assets/css/images/layers.png new file mode 100644 index 0000000000000000000000000000000000000000..ef90a080bcff7b4e7917539732fa85847c788fb1 GIT binary patch literal 973 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI13?%1G+4F~ifpKksPlzioFE2kozkq;%prD|T zkdTOoh^VNjgoK2oq@;|DjI6Azyu7@!va*JThM}RMiHV7+si~QnnT3UgrKP2nm6f%% zwVj=vy}iAIgM*`^qqDQKtE;Prhlh`kkFT$9WMpJiR8(48+W-ImSFc{Zb?esl_V&KM zz7;E0%$hZ8?%cT>Hf-3rb7xCSOLuqo%$YMMO_~H$Q&m;f)YP^&UNe7?b@}g zqN1X{z8)xb;J|^ryu7lqvN?0+0ChDqH00;!0}a``cW-57Wn5fbe0)66x{QpBoSdB8 z++3hypn}4}!kU_z+S=N>x;miA&CSiNt*vcsZCzbmy}iAYCr_R-Wy;j4Q>Ra#K4Zp= z*|TTQn>TO%{P_zOELga3;i5&0fG%0JYSo%GYk-bfzkdD3jT<*_-n?bY7NC2!ZQHhE z#}1$ifezTWZ{Pm?`wt#Gc=+()BS(%LJ$m%`@#7~?o;-Ex)alcw&zw1P?%cWa=g(ib zaN*LWOP4QSzIyfQwQJX|U%!6y=FMBTZr#3p`_7#^ckkZ4fB*iYM~|L7dGh@E^A|5( zynXxj-Me?6KY#x6 z>o;%Sy!-L{_wPR%c~^OC{BIq%{ z`Kyx?3KXQ`RalY*JQtRDSLSA3zuTtNQJuN${<(A8t(#W~=-W3ot_joWyQuH=ID3cU zJ+{0FDKXPTKD3vc#kN^{7_Yk|^uO(M^zDV-+Z;7(0w)A+X=i<0Z8Vcz$Em9<&Z}z* zL(0S*GIlraH5GVF)Vy~&s+8+G#>~i3mi3VpD z>6ugo2uhthvFZNfu(XXU-FpRj3w1v2uw~el_UdA`#kAjhtfdvC)BKpPZ+@e9TY4MM oxx+1cTK=C&bYJD1&CF28Aba!1z2xr;ZiC|1)78&qol`;+0Qh;)5C8xG literal 0 HcmV?d00001 diff --git a/src/assets/css/images/link.png b/src/assets/css/images/link.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f00cb2231006331f76e8fb34fe98ba3e6c4c5a GIT binary patch literal 649 zcmV;40(Sk0P)R-wVQ6jZWcdI0SI7HLUn+ckeHpfG*^&WNl8M*$>e_m+%~e1e$TbFH z(ca$P8S6G|`k$7O^&jK{CVU1k0`c?bFBpFR`o)l$lXnKleSPl2rS#vw|1$jj^9QU3 zuK|C7fi{2PLWYLgYKAv2UoylcB>fKv2xQp4Z3_cGzu;Pe0a#X1_5bVFum6KX!v1gG zy8ZvEHS7P!CnWywn=ol7P+AV;1xBO*o3?uOnoLGUMh1|?@87=}8tSSU5)xAxUcPwB zpslOV@ZSJml#C3+_wPS|_&dRXX88q- z<2Uc#FtD(3lrLGb_|3`F=ejkuv>3K*-o&7#twS)X7?&1GCf1H)a#g?Xt!HIMLl0ThjLv**n3J9+X%Fi7wZFolVUi|^~|Xai}!M<@(n=>QZp jqDXS@32BBI01#jRVaY0la%Xjb00000NkvXXu0mjfT~I+< literal 0 HcmV?d00001 diff --git a/src/assets/css/images/marker-icon.png b/src/assets/css/images/marker-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e9f757f515ded172e6f72c3ce55bbe15579649 GIT binary patch literal 1747 zcmV;^1}yoBP)P001cn1^@s6z>|W`000J>NklgF+#9zZY7a#;@J(5X0e&McXK2n7+jhR}<0i-1U5t`>D@ zJSJ*^swjdwq0keUf9!BETXZhVyjqS4&z|?2HdJnOU-HYF_xSyu=XsCkdtVv=(53>u zME@3F*5J;OHwJNJdWK(ivQ??rr&t7M)1yRas=d_yYH>g+p#{( zm+NoyW%|8bNfUkAMrabri(FY#Dqr5%zhZA&e^iALHXiJOFYA7Qt##L_a?_z6SW{&J zVeyp#G&snW>SO{*%d9CGVM}xic~V`MU$)*JU1Nbw2YX?ywi}|VZ4g;$g)p^+DoLHR zZ^Zr$S_=f^oU`+!4K^?NsU;H{;bhhex#H7(!s52U&FJ}OHQf-VvVd?Btj2MhF|zQI z%l~jBr~6T7^_WIHC1>8j&bv`c18g|Z3*l-jgeoml1{oh++Y75JI)RgU>LEY<%)C)X zI2rZ2kb>s^4cZuYeq3!A}DS`X~>Nd;+A$4e;ZwyD<1@2!8$ZKJ3w%!6)+sCALy+bKwyk zqKCS6qEGWmJ)97b-QXY|`<0lS5THkEtGgjE>ojOvuftfM&Ugd-rQg9C+|FdGM)HXs z(IxsA$&r(xg_j^4=hC;>s;1UF*Wp1I-2~sEF zZYgb?&`4bM1qjM*hR`yr3qJ(;L>Kj2XpBUy+)t((6z;bIr@-ihFNVAl4<#?{TWIaQ zIi>;YjXS_iIfNb?!N1t-!Y6vZvW5ZXE{%l7imzV9NvV4nf#G`Pcex;#@}?EINwsk7 z>UC=SlJC*b5a>-mgHP%q2+qF;cbNx ztCV@{s&fPsSt#;i@#G-m$as&$gLaG}ebOrtS5*22&glbhMH_fz8(~qVVN!VIVCKzg z1$U9^93(E%Ur9v_R*h#!t)Ce+#)+m(q^zCq%g&L-!E zC&et9WrT(49pl0S`?=DK7=`+;`CB!wP3ta97b)XdJ8K=@`DXOk0Q0};7zNT!`k4t@ z+)=9S)4p(jEGm5!qq)PDTmXiw3qDM19|fiylc@LtiQ=}Kfb#w&ckv^7tBj;cfwtY$q?IdliYlg zqh@4;IyW)OFPQPw4z|JsAEb7`+@yA@Q8SXQT#;upV`QNJ59Bg5m(jci3`0T4X-&^GU6)x7$Vi0XMWB(2hrdK^!hq0 zt!bDg$Hh)-9L62h`&{0PBf%7vM>69o`k4~kx^Wc)?lG!}=WgV2x-rq?HN#jMr^B0; p5zMeb2q5MEX5{g&Aa%N&e*pr!t%ZZ}>w*9P002ovPDHLkV1gpUS8xCT literal 0 HcmV?d00001 diff --git a/src/assets/css/images/marker-icon@2x.png b/src/assets/css/images/marker-icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0015b6495fa458ad39d51cb4b913430016f48d33 GIT binary patch literal 4033 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 literal 0 HcmV?d00001 diff --git a/src/assets/css/images/popup-close.png b/src/assets/css/images/popup-close.png new file mode 100644 index 0000000000000000000000000000000000000000..c8faec5ea909075fd573e032a67f867e66b0eea7 GIT binary patch literal 1125 zcmaJ=U1$?o6rLt(YiKdcqR^`BW&B}LlbK1Hgp7%uB$L`er<63sh@ehpZricW+;QgC zOuH_d3gSPgpuSYm-G{BPhzPPQtGl8_5EMlar2agJZ-NRUiZAs}ZK4mxd6;|d<@>(# zopaAU*xR$Q#n>KMTC}YD)T%|iUfP}*n0Ucr)IQmY*=A9%xtILzvJ!WVy3&F!l`m?E` z)C)4mf*=xP0}2~uL6i$};r3W8whn|?j%C;o!-WD|j1Px+mIZSkO|n_)0G}5-=W>x< zk{-g?oXbWd(O5JbuX07CjOft7Rjyj&rrEk&cMx=wWEP>N?S^Wn zg>*1mFt643BG%QL*vJk)eL}?$4X# zK|Ichse&_IO8oM%eXZA<3HaA~cl~$#;O(X0uKDUts}1@WOuem?wzQ7>mX1%ffdS8R zNtkG!x-4Av9q6xoX!W1IL@iu3N&DY;pPv-g`TFO1^1@#Y`64wnAuMY?X_kb_HsOh9 z>dcXunVH6a_AlCTqVdG1}u0u|Jx8&bb>M_o>Ex haIv46e`t9_6HEPiDxppP-SyOc__=J4crm?w?fToD8KiK*P3E+rbu&-aPsj zc=Ebe6OGZUe}O-uN6*HX7;iXbf%PCZY2SO3@B7}5d41Y!+}qo|xeEZ;tDhJxZm*~B z&Nlykc<@W$W}lf|)}{j%+aUpEO#1}ZJ$p!6#KzM{?@0-OZRmEotZSWW4)sJk#fXU) za5ey?<0P=1F=4PzhOVy*-(SBKpo?|ktY9H4sFIO;G7Cw2*6291u~Wpt@m*L-G%nx~ zX2Zlg_aiOQg@vxh{q$H8-~z(Nx^P)k*J{El4GAoWDC-~vK}8nj{E@1vw_y&+NJ2SD z&Shm)%jYzN;PMf8wh#}rmQh>g;*lisM*}^CAt0l3XknQ;l3M%MsaV>N7jZ z`q9Bk!61k4^u_EPbW+lc%_#uc)?oMkCtQN1CtUvkYo|1Ev~0&A=y-9rCKwJE3QGEiAQ|4;^Hgr zosHad5xjtBHc03`Cb$+-4=x(k+|9KVHtH?8cylevMy|w*kzY?be0NfJy|g@7 zuRZbku7`Z7zr6c-gZ~hj=4r>|c0QlK`1JfM_pY&4qdf=TUZVRv+OHesPV%|m!x;B^ h;MvFS@2!V#z*YuiF2JonxqT_OXvHc_ulvJ`@VbDZr$16ySWDd*l(VgHk)_z zajn4qAMgF**mQ%|yR<|4bm}G;RDIIJuo=1oY-87-J$R3g04Tt~>C&!ss(B>j-5kSb zVa(V7935w|>y0plJv;~^o%{Lr9R~wn=g!I&vSI@dgOhoJJM)&~%}1Wk^({SCUycGsI`)ycl}&YxV_ f86W-zukSws1+e=GC?7;Gf1;pSZ<()Z=a2sY#=<8c literal 0 HcmV?d00001 diff --git a/public/css/rtgame.css b/src/assets/css/rtgame.css similarity index 100% rename from public/css/rtgame.css rename to src/assets/css/rtgame.css diff --git a/src/assets/images/BiomeKey.png b/src/assets/images/BiomeKey.png new file mode 100644 index 0000000000000000000000000000000000000000..cb9da476c6032675b677cc00474f8ca17b6a315c GIT binary patch literal 27727 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/armor.png b/src/assets/images/armor.png new file mode 100644 index 0000000000000000000000000000000000000000..0044af123450dd6af3f96d39bcd5e603becd5a0a GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G<(@8%Ar-e6G8v}*XK-+E-r?gDa1$tQ5)c@A)6&Xz2SZv~ z&i@CG-u*8qDF6TX>Bs+xNg4kc7#W%R*KgSU|J(Qf|JSYG^`DuUxu5C(|9>w&fBwYq z?)?{rFJC@0{Qdj)1tZ8T4NdJe{QLp}A3uKhaO3*b5GEc5wg`*PS;tmt0Hql`UHx3v IIVCg!0Gu~fRR910 literal 0 HcmV?d00001 diff --git a/src/assets/images/armor_depleted.png b/src/assets/images/armor_depleted.png new file mode 100644 index 0000000000000000000000000000000000000000..c9bdc24eb8746fba845fe8737815131313725f12 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GNuDl_Ar-fh1Ox>w6%`c=CpR`8WN~T!p|fVqnnhMtR$fd@ zOv_VKQzh5M>@4d4d3w73{MOdizf-49m5ke4b+q8~v$IKR3(P|O{QTI`($d%jcpn)% moUK~0V8I7QpfL=LYz)@kk_Q}e|?^Z1Bi(X-m5h*Ff%wbFfe9)Uhxqmvd$@?2>=WeE*}5@ literal 0 HcmV?d00001 diff --git a/src/assets/images/block_nether_flat.png b/src/assets/images/block_nether_flat.png new file mode 100644 index 0000000000000000000000000000000000000000..298cdf95ddbc4910da14c30c050c9e375e911fe5 GIT binary patch literal 2620 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/block_other.png b/src/assets/images/block_other.png new file mode 100644 index 0000000000000000000000000000000000000000..6756844578aaf4efe2ef2ab3edc3fa2780342b4f GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxUdRE{-7;bCUl2|8LK% zCm$~S4#xBIY?+gj4!pg+{b5c6Lz3h47D**l)z)xj9tIYH zHpUw~hn5MlF)(#-F6Wu$xP!rgLC~Z@fPq7yix)=hVAPM_rxJDf>}+$85r<|?IePSH zph?Z&U!ty$JB8IBcuFcXd`MH9;rRUA+`|_*m>C#bt}>J~e@IPlU|?oA&X)Mre#e9~ Qpa&T|UHx3vIVCg!032Iu%>V!Z literal 0 HcmV?d00001 diff --git a/src/assets/images/block_skylands.png b/src/assets/images/block_skylands.png new file mode 100644 index 0000000000000000000000000000000000000000..641155f3b7fb0ab38048af147ddb327a2bd7691a GIT binary patch literal 993 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/block_the_end_surface.png b/src/assets/images/block_the_end_surface.png new file mode 100644 index 0000000000000000000000000000000000000000..69bcc329dcd335f99ea67f7d590ff54ec24f128a GIT binary patch literal 1062 zcmV+>1ljwEP)4Tx0C)j~RNrgUP!#^!Wu36$i#lf!2|j3%Ze&w*L!7p2SGvtw>Nd9_NSmf@ zT$;ut?S8Na*^6&F#dq-sKKTa>*@JI;k`2ZbVfd_wB24xov!0tYO(#d#()tZ$I5%3%!zLYh@BH>w}XODA7?mkV}ap}jU$$3 zG&Mk)3Bm`(LOM&hKscCb;PVaG&Vdx+MpZJHTQ(R_;DA31$+jOGBoLXk_De?ey1m!ik&_4G zH9n^))_*|$z4!HUisgBd@awc5jn(v9k~&t~+vLrrBg4dZQ9lDnLV}JQWGLW~LJVP= zW5lZXOcog;N~F?hbX0k=IMzETla}oqM|jC!4!B+x^;@#I_Tc-T-6hwKycLDTx1-om z?X`jFy0R0R8-I0SrK4`)H@W4T8*Qr#2vPou<*`U!Wy(*2QP*`g=8#jD{B;Y@GL-Hm zb`n?&x~%YC_$q7)PlXr4m%r4=&fcvN%Ybn#KC7Nn&Bp8{(oE9pWVpYI^+LuN`H(R~ zTAjWmO`M83^4d@fCkA(d>*nHIFV_d2yUbnT`nd?LE^;G|!WZ>Ld?E0@Grm4ww{M7H zr`x{MWb30bTI;*hk-DO>dX$gbC-yy#suLNqvA(f>RtPJ!qGM`Gvvf}Y10`)vm-7Xa z?-7Ixe2A_siI1ydSCCID3U8SVUY86>uSnT0use_K1GZDvUFKY)t}F* z)!pahe+zh{{06Bb3f97*Uorpy0K-W{K~y*qWBmXBKLajs^U)lzq`F)RBQ75p(N#{%k#mRM^07+ gNx}@mrV*wF0O;&eZ!%I$umAu607*qoM6N<$f{kqJEC2ui literal 0 HcmV?d00001 diff --git a/src/assets/images/block_world_biome.png b/src/assets/images/block_world_biome.png new file mode 100644 index 0000000000000000000000000000000000000000..a72932a5da2832ec80ed4ecadb8fbd3d3d58fafa GIT binary patch literal 1092 zcmV-K1iSl*P)4Tx0C)j~RL^S@K@|QrZmG~B2wH0nvUrdpNm;9CMbtL^5n^i$+aIn^?(HA4aZWV5ov6ELTdbo0FI&wK{O>*+w4vx20?>!`FrQsdJlnHR>OPy zcd~b_n$otK2Za4V;76L-DzNVtaSB-y0*E}{p()372;bw_^6ZZ}PI-92wGS&j#91PI zKs7DSe@(bk%_Y-7gGe}(^>I=@oY#w#*Bu9GZf3^F5WP>3rn}7Ut74&?PWBFvy`A)a zPP5)V!Xd&78LdA?xQ(9mjMYElVd13a#D+Z_7&Y|xU=_C-srWU*6kiZcC!$nw*)9$7 zn6CX+@=AhmkT}X@VSsa5NKe;HZuq)~1$`#h6R+ZTR#D-3j}vF!)ZOnz+5)dI4jl{{ z44Mr{P!L4~VVJN`K!!XTF*LGrKO?IK8z<8w`3e3jI8lUGNUta*C8 zn(P`s>{pjD=7Kek#B;Fw@hxAK%$F&Q6vg9J^Xf~4by_hu-=A!MJ3Znq&n~srbFGPs zH&&aMXZ>nO`|hf|ljc?VPhR!${AbO?W8x_>CU%PFA&Hm8F7cAsOREdwU~R_;ot1_u z(ruCYB-LPGn!NQdT|ZlRy+(fw^-+`=%+gee_kY4FWHg<*4sZI8+sFJD270UUORdLHO0nA4V) z%{fwsET5CQ>B?eK%uw4yQc~9?*JVo2}ze(;aRcp*ceL#HUJSllrgm5wQKR zQu+C;QrUh^8rFfA`ftFz{YAidi-`aL0TD?=K~y*qWBmXBKLakHR=N@_d8<2|5tkYk zY!YydJ>g(!$;XXggPyOb$1n)R0GLKT0bvw#pRcTk7{q{S5F^M7FpamnBN&WZccW-N zQ{#fd2XQ3B8^K~A7cqfYpC8{~0BJ@CXFOIjFq}z8V5kC^i$Gk27aAQP(g+arcW9JNFy!)4g*}0 zU~!m1I1~{!0Eb4H@E|fk;<^LORRrlY&uefs;FJjCNk%}DDnGvv!wsoCm@vZ)9&s?+ z@pLAbM$Qu`2EcT{40^8F02Y$G4xy1X!qj3l0451H2um)6sR000>S0j{QwW>@0000< KMNUMnLSTZwhV+mC literal 0 HcmV?d00001 diff --git a/src/assets/images/block_world_cave.png b/src/assets/images/block_world_cave.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a547bad64014b18faab08cfe95d1d6e136e807 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxS$$E{-7;bCUl2|8LK% zx8V9tW}V8FcbWyKOEoYg9Z6&GSuC)hVaES=kJ;H`*ce#^x)@(bU1T(CW?TeVXp(PiYcMc;aQ5rv0y77OjSIXF@jRR!dT_NM z8&KzAh8(uU%N)!Mj7M66+0H7&Feo%|NI7sYum~JwgAsQcu3tFf$W!tAq3s-A0S67w zNVRmX8OmMLR@Bv3_AmPQ^N>|V5F3ZWnwgw;7l`}6OU!6tY+yK)#jwlKf7z1)!K{3``xI(_glj9A)#{JHVQG$Wh% eh~pdr2@ENWVV;LqpL!1rMFvk-KbLh*2~7a4w2Slr literal 0 HcmV?d00001 diff --git a/src/assets/images/block_world_surface.png b/src/assets/images/block_world_surface.png new file mode 100644 index 0000000000000000000000000000000000000000..603c6d5129596873c480174a9343c483964cfee9 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxTF?E{-7;bCUl2|8LK% zC$RGhtIkfFDt=`>QwGK(9cLM4xH&r78T|kI+n;9#4-TVcsCw;;YQVz#<^*Cu!1Lz}Uc`l)<3LAmAV(4I>Je?P~w{Y+3eQ-tG|4h?YrH z?#}i-C}UR_C&GK*{-4vuiY?!bY&4l!1g@QF$-A(*eZ8T{AqEGAL{o;l3+8TJUYM5N bz`)GlemEu6>xohs(6bDlu6{1-oD!M<Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01mML01mMMoQxmZ00007bV*G`2ign} z6cH;9(*BD800O;9L_t(Y$E}u2YZFlv$A32&lcr7DPOXMQI#G%Q7ZyK(g5SYiLB*91 zgi<%IL^s`73Zmksw1w>a5F+^kf(wbDk};^QwGZ1goutWi;W=SCO<&-J%N>%rzyG=C zb;oeRVXZa#Y>cr-y>Ctc4Nm|Yng@!RV}fHqJTwi^23o+bthSqoIVLy(B!M1TV*;+r z41gxkj*6H=zz%RqplP6AW?Do8U>#VMbsK0zMVvz{R`39D8aN9K7jmiRy187f-vGV| z=ePXau-0}&oX|<)VsQ${0D}U~0waZ7>KVY*%LAPg7jmh^ai z7!qqo1UwT4fB0PE(pXnE1^R-@5?gA(%p>G;3B9eJpD;)tFs!RZGKPoaeJ+Vim z8~E1b44&uV`@a4aSGcCB!UJGyz4lKdpU-y{30v&@eg{53JH?lu0ZTy40m=h~ ztebch7SW+rcLCoMun#N)n?OSgEhbU#1I|b-T*$hK7b;RJl>nHZor;1V0^flj0$vq( z0JKb~7iqzzr6xv!F+GX8C<0dKisb#46j&2z8DrWe(n+-+rNvz%z-ZP@Eb4npYmEm2 z{3Q)e!8_7TTaq-^7-PG&YduM?1b#@?q-?GM8^E6sxGDETJ9_b$11=klNm7J*B&9W- zcVyjX@kwvAxPY~ItN>d_fseeCLthUEUiSa{tK!(7D&g@L!*y8i>Yz~$00000NkvXX Hu0mjf>ttG= literal 0 HcmV?d00001 diff --git a/src/assets/images/cave_off.png b/src/assets/images/cave_off.png new file mode 100644 index 0000000000000000000000000000000000000000..500d9872ee1ce6c07a54ac46ad1fe00c1dcf863a GIT binary patch literal 1134 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/clock_night.png b/src/assets/images/clock_night.png new file mode 100644 index 0000000000000000000000000000000000000000..0832f0cb7fc272a7004195827c0e5d754f17c231 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxV!#E{-7;bCUl2|8LK% z%An8?QQ*0!<|pUTl)^$gx13iDOdW!ESq*yU%;DI$I(+@N|9?0Wtt=wWxrXrzIB2jn zm@Lj_xj5gxejnEoxyBm`%{8@m%MM>*U=g^(P;z#9y8E;A%CIy5jcyk=@)-ed3T1@u0Hr>mdKI;Vst0McuDSO5S3 literal 0 HcmV?d00001 diff --git a/src/assets/images/compass.png b/src/assets/images/compass.png new file mode 100644 index 0000000000000000000000000000000000000000..2614dd30d6158e70edce299344712f152819eb3e GIT binary patch literal 5203 zcmV-Z6s+rsP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000SoNklS{jWOs*zU3VyGn4q#KM{${(1{lB|V-YuK5c_hWbZ z$2~(YvpX~Q&Uc0Ys)wdy}*#}8h}(P6>o8P1DX4DE4T|l%4DvK z%bx%rie>H<*K>fL7I$N?LMH;h4V(m4+H?&*6w|dwH0lDn0eX9TTlDF$ZQC}B)oL9A zj*3YLfS%0vfIkYR`$ePvS`&HO`ST4=W-67kS}YbxlBA=+3t4fPD>HrK-yz_x-rim* zk6fLU80zTo0n=q!PDzrKm5UM+GHm(IBnWeB@%fN_~Q7cP4DS+Nq=?{ z7Mpb$;BDYd;EBmf5?~7uo+QiK?uf_#HYE^P z9Cf+YIm6*WBSw2MoB;L%-vRys%x!ie1JkCd&QR!zGZb1Jb2^VW!{I*}^?;1vDd1yZ z9&i>|*R=A{=iAyI41VH>$Gr(z9#A5YN6omCMvw#^5=-1IY^>)1dovLk_IO_R3=KVR zO{c9RR%4`>UXzJ7h zQv!i^Y^l_Bag}m7t|-xHm)X8bB{MAKXHs|13hV~{qVuF0S2j+WqQqRTPuc^4?b7Jz z_4}h%YkJgTxepkr6`2UlzGIyG4+w3)uwjjGpKqZ(k@#GRMCRwd7gv-g9I@D^rSw~_ z-+d4`KF5{XE^*)seM->h_L~I#MK zAMgE9i)D1gW?P!01L{I1z$vsaem>kO%%`<=AacDD4);4^vCe#L5{l9-N26s2QY#s& z+y$H|@V*;(9e7q~{#tl5zjX(LuiDb-yaAoKqMTMDk^Pl;UM0yK5zGBrk#;|-w%0W5 z^?G7X=cn#qaD$Y|UlNeA+XHeec7LUwTj?nJfKW)qutbLcp;CwnGdsp5B#dS(ZsTT+!YG_%N~y#iUnjO zDU)t%TTPYHF4a!s9s*u7(Ov;w@~i4$zp56Ldyy$qjfW%&)7u^h{MnXD zIm~pBk)%w@ZeJ^Y)T+Wp?XX`M>8s3sPzi^--NDkhNGQsSay0sGEe2TYI->6~ez-0# zq)dj+%a=>D&m0cF9F1P5}qZ zkZBr{M9OYo--FaM5elJI($7?;PdXbrRH!H4TlMcs#9F1-*EN`_Z5}(y;FpW@R zT~Kx=WtnT8okbPS;LMp^zV+5S>N${llQ|cylCB^E)2DOwrkfbGTE~--T)yQNhP_^Z zoqknaRjPV!5R+i{C(m3q#5OcY34G-gp#~HENNGJ*sw;OI014sO-I{&uw=dVnr znfV-A3fPPx&altN;LMp^>+B@b-kwV&Xhmc%`&HFCS;$;ZbxUWKp=Cjvp3K>3Wi!>r zGk#TF)XZesfmbOnd1mTaepU6n47Ae1 za&Vzc%VBOakZA>87A8w6xCAT(RA5huez#l5YWqYd^Jz-2DLN)dJS|Av1uPc?o5cdO z3cLwR<}%=CC44T77Lo5_Y?$seFrV?uzl-5}Xw@SVj?50Ryv=$dS+WZ4!MO%J2z(!i zne6{CRVrt!CYeWs;xUROS_FPM#)}pX0*g&5C!hFk)`>#qPRylrF9=e8QG$Z`7`O}g zok{W2JrT%UB#d*TcpmsF+JP&jB8*mKYo_vUH(FG_VafEEFhK@^)o5D>V-0g(M zE5Q9?rsgYaREmtDW@P@lKoH@g@T;Gqf?GsN#6IzZ=Cfhv8CYFaCG!#S8V|3CC3c3! zL7(_e#|p^(HT58Ku9%g%2nwJ2VH)%NqpAQoaW_keDU?j+v)s66CyBOArPT0Py>J2eI%9X#EfF44)yZ6g7Rt)vobZhgFfkEB zi#|Qbjhkq@f%~dS=FLK;WN|?JvgeriI4+j`8J)X%#EiRXhD^OLdr5c~J1Xc`Hv$HP zDVI%;BmV{*+qZB3q3-_mbL{np-e<|&Cn6|ETm0q4Nnm9$nc0taPW$E-U*=&O zM`n7dZ2)&7VvbPMLwc@qmw5|iEb|tbrNOV8kv%OktAN)3TTwy$Zvb{NrH`9^T801s N002ovPDHLkV1h!?*8Kng literal 0 HcmV?d00001 diff --git a/src/assets/images/compass_E.png b/src/assets/images/compass_E.png new file mode 100644 index 0000000000000000000000000000000000000000..a12f9878340a212d8d56756c15d79e42ae9be827 GIT binary patch literal 4323 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 R;4uII002ovPDHLkV1m>t^bi05 literal 0 HcmV?d00001 diff --git a/src/assets/images/compass_N.png b/src/assets/images/compass_N.png new file mode 100644 index 0000000000000000000000000000000000000000..4794e3610185cfabc3599475cb077b7c75ad23b0 GIT binary patch literal 4187 zcmV-h5Tx&kP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000GsNkl3_(KANatB81%tBTGmTbm*5DDzegvp-YD7ElZ+1!jo>8X zua!)P)Jtvm*h#t5+(lCE4CqJVBtsw>z0ukz<<98v&?rtax-XdwDXPktK(fR|Qtk|a z6c3F5uHsp72TFOOD>yuf25r%<{VyaDfFN1!RCUu&5sA1k%ywA5|wm;d^`;y8{j|qK*_YJ=U z=FaIo`qYV!D|dL#(D}NhTOD6icx}<=yp(cd2G~67n@&wlO;Q@S(@AOk&I}OqLmD{) zoOb1gdp>7)j~(pNP?gZ~R)JgaIWMiw>4_R09sO-@Z!gr^+B%~Q;{ls!uCqLNeZh0X zi2An+QTs9F(+|yqm95qr7X~Op(UiqH?7WfH`hgh`a za$G++AehfnY-%DO3b7jwQ*6>AzRWem5Wg4f2>k)n5|Oo z=7GO~&vb(m%;))Vb(QP;`|rKxZfvk|=MMWfZs_=Pl~X+}-QC^Yx3;#n5s5_pRAtU< zJ5PbRYECNeO$)&1zTQ>dcjDBy*?B(ktWY4bvO@E_cU52S$!1xNM#+alR{`RsN{X*l z;8<5>??}ua7#R3#d3pIT5{aNn+#IFxq@CrEp49Qim73vg1#PH8w7w91u(44Ukf%Vg z$gTBt*82M|;#*i!sV=2@%%*~ottagb4i5Ir&(F81hyIdyA1-ew;gAnn+!sJj9XOg? zm;O|WK#k)`{}~vd5DeD)Hr~mu=7@7wrJ;nEbuqiBj%v|;#FrYq5_)1U3e+(_wq{U;5kKo!{x`c&kc&@P{r=LG~-~fBnelz}8vI9~^ zAn6?*Tq$?@hlebNY@{}_lQO0+&=yFpt)amdNcj^$WCfD`eMy{T03>me0pUTMq`8xF zoWqUu0_kEQWo%fSEs)l!ywNI<3~-Y`G9Wyp1(NMi!&dfDP+2c0@o0y`VHW>6PocTaM!lQ~SImandE~2{7q6PKWd)z4eIF%s7Fh lv8v4~lAa_ICpEPG9{~4}c^U47g46&2002ovPDHLkV1k!U*y8{I literal 0 HcmV?d00001 diff --git a/src/assets/images/compass_NE.png b/src/assets/images/compass_NE.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c6574eab8d4637cf4053f8c148256fe9ea8275 GIT binary patch literal 5165 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 bBK|i3_WP>6KgXn>00000NkvXXu0mjf-D=sD literal 0 HcmV?d00001 diff --git a/src/assets/images/compass_NW.png b/src/assets/images/compass_NW.png new file mode 100644 index 0000000000000000000000000000000000000000..b657abf895972500d531cd74aae748fe74ac830a GIT binary patch literal 5133 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 DYI)0F literal 0 HcmV?d00001 diff --git a/src/assets/images/compass_alt.png b/src/assets/images/compass_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7cc4b8e3cc2db5076aaa844e60e08cf25b718a GIT binary patch literal 802 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-mUKs7M+SzCeKo%WCj zoWL5q%%{;>PhGuTaDG$+LlQ$}iov6klhyw}fApv+SwMb%6;NmTx949WGFl2aCUQ%M9 z^qg7Xz%$Mie`b~o4ab2J3dau^bolq!%}`Hx#RycK%)-)9YQwXj8f^aoTc@DI6Bu`^ zJ1{6Tuw7A(@LKr)hfVWouro`(a}@DR2;zM7nT3OaMIhGJ$&0sdwaMY7ataL@?*x;Q z8TS5Tu-vt1(Ia~!`T4d$mnxj)&p9i&K>cIc9FD{WhDB990>aD-E-YWNw3`=bLa42i zkKBQ)eTzhZoTGAzOGTP0nIdHuUh0SdhDymv<_$FsYdQTg?==85EA3wE>J{j<`bi59 z15?M6C9Zy{Zv5b|5_~II^y|utc?&%6H83?W9C|HSG+S7~!5=L7@C%3PVyQ1)ekXuF z3b1kV?Yoqqrvb4eDz6r^}A z+y)04vz>#xE>Qd7W6BJSE~WiEE}NJbfk6@3bKx>r!C|#bMsQG^pCuy;3KX|MhppB| z3(6ttsxC=!fIY%H+lC2dOlUt(2t<08JKH6&F+B?ct%?|n78femGBN>e3jEk@H{Wq% fwgv+OBO8O$t5h5QH(N!4iJZaH)z4*}Q$iB}8^RWj literal 0 HcmV?d00001 diff --git a/src/assets/images/compass_flat.png b/src/assets/images/compass_flat.png new file mode 100644 index 0000000000000000000000000000000000000000..3a81604545d0428a448501a46c720e30ea66db32 GIT binary patch literal 1844 zcmV-42g~@0P)ccu^tuQPt+mjDt$R7IO z3dK%a+Icl7whJWID#@fKF^Q>vc8)u@yQcn0Y-`Rr{=RU?y?BkDeDeLB?>RR);^N|> zz`8D8yjWFHQSoCa6#BEVvGMHX%a=d1+wEsP9#4(Hfg~O}k(ZZOe)Q0)CXt6g#8q%eBoh5suU>84 zHaR(79F4}VUAy+REX(BzK%z&LK3_oa`MyDi-=gNUt7;pJN%YE&nvt_UaS6!+kmy!9 zYSRFTUKvm;L9LKCNIXSw8ySzx1QtM|6q3H|0VGPtqZg?hAkmxbG&unh{g9yCfs+8z z>wu&sJ%B`!aO_r6=1fk2L~s1ovXaq=fJITPqxWoe_`zt^MNSh$T zI^~Xwafx+EHUbKq#Biy@+5?d24GjQ^f%vVdfHZ(av6Gk&4_m=W%!dbX5{tE`6wjh9B>f$LXyC$xdFJO3e|d?Ikd5nLH7O zl&%&kIy-s&TXBYoj;#A zapL%uD_1hvlT3TDS98Q`(_C)u5-53QX5DMiSR^bMUO6{lC%;Qts=PXA`Vtz<^pBL4 zmGz>B7kl+}b#>j99zTAZEGa3ey>#i)J55bZlGSR>ZEkLUtEQ%A-|+BobcMNza}7sq zszQn)l=^&vxUjG$%zuiC-t@n+XO%Z$l(awb_KCu`$6gH}}%d zXJr|uIvg6ZIpN;B${Sb@OvX}MQJWg&XlG6%fN>}21y3~l>Gyl@WRTM8Qpf_415>d%{-qK`NRn@53Y&KrM ze%*>7Sx%ljIf~##Z{NP1?tPfODbO^C+-=6R+B9s1ap&PiqPwCfzwO_@|3mG(udna! zn_h7!B;cyan5Kbbb-~lCbAw985q#`tdBq_}THh*(NOPW+j>?7Xe_iE?E=s3H>n*q9 z;9aHTTFkH1InVi;!^^a8T=40Zgs?l3uq?E`qGXU=X)d9Kmrqe^$}|X~c96iBVyVWm zw%?tfw5bh1!f<+790*yxpER;kd|gK>qkUx-QhWo63Ls_4O_>H2fV9ba1d!O6SZ0zK zeE^AWNM45fxn;_o3Xrm+C!~yllQ>Cu0EvNd3CbPiPMRjA5g<_<9#qErxFyP+7a(Q7 z+|7fN=oY>~=LaXTA07Y_<&f~_D<%LE-QmH@LI1dSk_wRMpDTfrDA8IAtpJH4sZj3N zEP2>rQviwX@Zja7ZvY7(Wp}OwkSH9J=6MVaJV9D%p%oxeJ}&u%^gpBmkg_ya@^aKK zt{^?)vDEQg?!ZalB!IM0Y0E(K0;OA`ZB&xLmoOZKr)0+?qz&zi1&}u1NoIgVw{WVH z0TTUAG6Ez@r6|hp$BrFyPfkwG6%-UmH*VbcArgt4=Am!PHh^N^o<)QVYRfh)D;&OHy$~1 z=bfGxqAL+SSe)X_FVErh6+)<@vmm&XQWZJpR_)bkIq)&YDzfTWT+3T^gon2m z!RaXPf`0y)&pEH(UiU8Jz5a!3rE6Gx%k<{G{d>NxT)V%V;g(;o;eW&VBOA!YBLG}_)Usv{9+`^o)CbL=ouLlZAmbgZgIOpf) zrskC}I2WZRmZYXAlxLP?D7bt2281{Ai31f~@pN$v(Kw%+uz%*A7I^Fo2cjokT?AZ<79+~MJ8-!m)G?9pdsVM8;e)1BSjkFWWha4Rh>z2o=R zC;b0<#p8eFr8X*72+h=syNeS3j3^ HP6OGP- literal 0 HcmV?d00001 diff --git a/src/assets/images/follow_on.png b/src/assets/images/follow_on.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb7be7a830cb0db93246700a0f6551e47417d70 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^{2A!YBLG}_)Usv{9+`^o4a@mtocL9YYOI#yLobz*Y zQ}ap~oQqNuOHxx5$}>wc6x=<11Hv2m#DR(~d%8G=Xq-<@SioSAB>ZHv`R{(cZ!aHc zx;4%E`R44u)$3-S`tbOibDRD8`-TQUu%Uy?&}Q9>qz(V-<~znUO-?+v%)Q6uwoc@n zLkECh!j`Sm6aRfv=P{S7O;x#-KQC?3|E>M&f3Dw`d96OBd1l8&4gG^BKbYIhYXkzv zZHsx{8L2r*$?~*H@WoV|E_i$~{Mhro#Sb1fgd3l6tEo#-I_8#QDHf=BXBOwp6AP94 zZ?ByD^3{LSCp-Q>{=`?5VZ7*e$Jv!Ei<>9(S~#}Nm#LJ}WMsG?o9OXzkEb8ddkmhg KelF{r5}E)!GMOO& literal 0 HcmV?d00001 diff --git a/src/assets/images/heart.png b/src/assets/images/heart.png new file mode 100644 index 0000000000000000000000000000000000000000..fba847742a3065726c8766713370cc26bacc7761 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G8J;eVAr-fHPT2A}IEXMjOf2VCx|l7><+s_&ed3GQW1%Wu z(pC?d>ZBs$OlRu~w|6Yq+E&{0(QRT7lV`u_wxCmw-%Vcf_`KZp e$xCXOco-HxmYp+m<$gDyB@CXfelF{r5}E)@A41ar literal 0 HcmV?d00001 diff --git a/src/assets/images/home.png b/src/assets/images/home.png new file mode 100644 index 0000000000000000000000000000000000000000..5b15f03d91972545039ccf87464053d071b81127 GIT binary patch literal 428 zcmV;d0aN~oP)P000>X1^@s6#OZ}&0004VNkl6WQ8AUp{_yYF`;#)}FoSa&UZ%}XQpfBJo4t5h9L?K8t z0Ym&lpq&Z{-XV#mgWv7GpW{CK?zjg;QmfTyr_=dF%4{|p%w{tT27~r+IBfm(5^wW% zyLDXGT}L}vmY)iR0^u@C{qx=y;??iY^%0Ap-l{Cos@-P2;cW{I-O$uO&>m=&!b+iqf{!zdhR5us^$nGKI2U#p66jQnZUN~>?DW70k&&rsi0UaW+#y(35udX zmgVduqTG)p_T%^aJ(kO5>cfH{xGV{R;3|nIXOpZ}tE&&)?RH{G7=~vX(&TtN#@4?< W{-EnTc7+oF0000A!YBLG}_)Usv{9+`^oavU_hWIt~<)EOCt}an8@p zP0cG|a4t$sEJ;mKD9}%WVsZNFMr%S-rs_>evELm1!MM0+hlUzO8Uj<2qD$JbVAUe}6aU2sCaD>o^*v?OAj# zbK6AyX(s0%@E=ie4Z1knbJeO<+dV^aCS}cXQ)xcho!^`&G2yvo*CL18+thZL*dN_7 zS<`OL>DWa&u@7q^7q83yQro}o^@BOT=PtOTYW1eLaQDRjT6G(Pb>a`})IO-#bujil oTf_d)gXYI;^d56J=gEF#X?wMYPtmzs5aA!YBLG}_)Usv{9+`^oaCjT?6Rs)43OI#yLobz*Y zQ}ap~oQqNuOHxx5$}>wc6x=<11Hv2m#DR(qd%8G=Se$-4*^ujygMjOQHf`P9tCxIU z3byz>HeAD8JtyX<63d#kIZTs-v>kP>e!9J5k$~{zTj9DopP!%AdF|3tk(9yH0v;xlI&8<$($-5BSquvyS~VTXa|B)4Wqi=47__J-3( zB_#Y_?sboxrqQ+NcAiU1-_ww{@ yt0p};ueM_L&SDSQ{}Y}Ggf4yknfbo8J%b$kPNOr%tFHmQ!{F)a=d#Wzp$PyCu8B7Q literal 0 HcmV?d00001 diff --git a/src/assets/images/moon.png b/src/assets/images/moon.png new file mode 100644 index 0000000000000000000000000000000000000000..0283a879121166dc7a60fc2461656c17892bbe27 GIT binary patch literal 3248 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 CmGP7S literal 0 HcmV?d00001 diff --git a/src/assets/images/player.png b/src/assets/images/player.png new file mode 100644 index 0000000000000000000000000000000000000000..212039f167b29d0e1ff27752aea61c26021e3b6e GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxVoxE{-7;bCUl2|8IZT z(d}3j8(SNjLfQ{qjfx3}PjoO!|0sMX!~FX9_iq7t&42&@?`2>-(zIl!pvtRH?_|Ty z8Zd;^Go&$0ILjd5pm48#M%sc--ilIXp2n4{**O%{W+-f&b@3__i-7Qn^A3zjUzMbp z`1BhXk`9R`9ATIc2V^O&;jw4nQ0U^tB-8>vsfagx0qNGrZJwmEl3@w^5^;rw853Bf zJTCBra|<{u*wZj+CdX1QmFrDk8Ce9Bm)?|AIKc2&!_Q%+TPZ8hdkmhgelF{r5}E)$ CYiq^; literal 0 HcmV?d00001 diff --git a/src/assets/images/player_death.png b/src/assets/images/player_death.png new file mode 100644 index 0000000000000000000000000000000000000000..9abd211a8b3273ac6311798def0469793b6c87b7 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;Uj1_nlXPZ!6KiaAMt{{OdU zHYzA8auRi5`u*)~vWqw~hl1M-MuXn%`S*`4o$nYLDtcI+Cc4r3#u zf9$U^89EtR1i1BDcjUOUGcX=`@#4h~`ABBNIEIVAzrRmsc$Le-p`ez-wRg{+0}^w4 zc^Oy)!t`VI*2!v1OEYjN@Gv`Uv)xlKe`Z>ENXzEJolFW1275N--Zrz4UM3kUBMDT_ ztRdUL6y)Z{*0;a@|37(^HlM>!9BLNW3EXA4#4X@Zpnt$gLWKLo!roptHU>r(|IP(R z7#B6F9ac>YGK!eM+sGL7seUv-K8h%!wgk- z%<^R30|SBS6B;c#V;Ow%?``LIP3&mrol*Dch1raK-#_WjVB=8eie(UR(21{e4!W{l zUBG_5T?v~{b(ZuZjhy*gIee;bN;u3pcYtddBU49`IM4;B|3240*i-*M!1!oicltpS qV{PuPAJg9pi2widmm6la0YkyFNY)Mhej>owVDNPHb6Mw<&;$UI-?I?_ literal 0 HcmV?d00001 diff --git a/src/assets/images/player_follow_off.png b/src/assets/images/player_follow_off.png new file mode 100644 index 0000000000000000000000000000000000000000..935e7c65e8607696f36e4db42909fb2d5ab4d737 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxQ5I!_VyZTYioPXs{j9wcbkMlLxjVe>+9o2qGag?FBxVWwQ z`@4l1P!VOG38s5$eok7T$iV1QsKCS`(8j3lKQAR9D2QqE(W6HVkGQzH23}!i5fIip zYtZ_`q?y5iVWEVAj!w@)f!Pv9Kr6*k`ntNf+L&^ZPB17mXz;l-Ffi?Y0Q3RRrAwDo uGFej91c0jC0?OE)dKBfbzcOXyFkq;e7TrCOBl;}R{|uh4elF{r5}E+xNpv6p literal 0 HcmV?d00001 diff --git a/src/assets/images/player_follow_on.gif b/src/assets/images/player_follow_on.gif new file mode 100644 index 0000000000000000000000000000000000000000..6937e81d9518be0d50e481832f280ab5eb89a801 GIT binary patch literal 332 zcmZ?wbhEHb6krfwSj5io9|X>v`9ITmCWCPrgRwCK5CDY~|8x7fh6Fo12DlpO889;f zMHPRtuyQf5Gw6VnfV49(J5_AEvo_^~r)s3i>$U99621sBE|_{(gF$WMwt0?Q^23fB zpS`8CZ}(#?ks#>xmGjAdeAVc=ol02(XhA+_Mh zDnUk-+|bzA?`P(#hly28UGdpt^&})$ASvf47de%usdR1)gR$@Sui@pjBI#ZVKTNWx zU{@~Tu*S!$!Bu5ysnPE3=cbg`F4$3+`pje@4%0mtuiWn9IG~ct6d(O?jr@_!Sc^$3 MmX!2QW?--e0L_1Bc>n+a literal 0 HcmV?d00001 diff --git a/src/assets/images/player_follow_on.png b/src/assets/images/player_follow_on.png new file mode 100644 index 0000000000000000000000000000000000000000..fa790c51bb44aecefc0fbd1a705bb7fbca3f56f9 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxSqyE{-7;bCUl2|8LK1 zZ~tGC&FH}KetBO8rjFK$6F>HpvNjuPi)YTNuTN%(<`HnvQ8+g{n}^3{(-O%8+I$Nc znL0X6a%V6oGz9S6uzIR=c%tTeNsdlM<^~2Q!w0&Dbq#vgFwT}RV&G5^VSZHPB>B$p zjpM}zUmi&Y76CU2g=`Cxr>2h1K-(TUuy82wFpK#{o?UR{0aM!TryWThH=l4UTEWht zpcXSLk?Uh78zabAhZ&B%&WdJ+DGWg8oRE1hQ_I78G%3&OG+>MJCYa44$rjF6*2UngDIVb8G+r literal 0 HcmV?d00001 diff --git a/src/assets/images/player_travel.png b/src/assets/images/player_travel.png new file mode 100644 index 0000000000000000000000000000000000000000..03ea7568b4ee907a0e5af314af76428c553fa0e7 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;Uj1_s7JPZ!6KiaAMt{{OdU z=CH7|bd+#usQvxT@X!qg#v@FZZBkE(EHdHd=5D@vn1_)=K`g~nRaLc#t>(`U!Do-y z7AW!pl|6Xz;>Z72S63(e`TP6(|BpYF{_j1^dLTz&-v^WD|8E6r75wWK*FPYUajbs9 zJ+=mhB&Y4QZpV|^1UbdpCa`!K#K*3f?HGBhIq`OCtik;G^W~4a0u4RVz$#$GBFVra z5XS7m$iUcgwV{VAvdvuopTU~Q4>D)=|6Dia;k(PSJaN0G8(v{z5xBz;@j~blPcS<( zP&b2@hnt(*g9)vzCU!kC%nEyf22A3c;Oowx%QJf+gF?dry#}@C|4&HVbTx=hlt{DY zU}h0e*3n>#6rA7b% literal 0 HcmV?d00001 diff --git a/src/assets/images/scrolldown.png b/src/assets/images/scrolldown.png new file mode 100644 index 0000000000000000000000000000000000000000..9d07aa655b1472a2342ba38c3c47e8d37a3399d4 GIT binary patch literal 1019 zcmaJ=O-$2J9IwInF+yTYOjJmGmT)nweeE{3RVvJN$kdW$OkF&vrG2mh?W^s>6%HOa z7$6)xc<^BK#MPr5I2gewCMJ5&#Au8OiSeKYKVtBPuVWh?oK0Te`@j5tzyIf(%?+Gt z2^|hG4AYYBSMqe<7py(I=>N#iO^t4cNTx^z@h~ZCE@Dy!9zq~%X(K3)G-LAWGt|v6 zO{`fclA?N6(y_&90fzG}hq4)_yT^AleGCyWghotTX4jV8tvpmdut2aU`BEm&;r^ z!eMuW7m~?jpdpH3iU@m?HqrdB?X}kw6y)iy=@1j!AW+nX@C1=r8tGOFmQ$Cty=s|g z!FXSDc!7gKN;ROW{vT>tb+kwFXgl723VVe~2l092;R#o#jT>$cTsczOMH<0w0psyn z6>}v_uvfwkNDszQ%W$ z<5*xrE>DBugU0^V=-L&Xp5Ry?TWZt?AK7%;T{_m6r*psPlfYReRq)?_$)5@J9^LbN z@kiVHP3Zwy-#hwgrFZ7~POJ6isC#2|$GMjH@8yoWj~@3b(S_*zlf+VM+xWco@y_eH znODho$3JYWbnafbbz1b~rw2dJ&Ai-LKGtuq-JV^%_a=0H?Q8R;{V%>ZLnid?VuyKP QwJCUx+01})|KyeFKl%enRsaA1 literal 0 HcmV?d00001 diff --git a/src/assets/images/scrollup.png b/src/assets/images/scrollup.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b6c0c4673acbbf9079e83bf8095789aa11f802 GIT binary patch literal 1005 zcmah|PiWIn7|)oLF&OS9D(E9qPiyjC+9qvSH?pR61v^GoSWjY_yscqNUY5MsZ0s-` zC|<;?Ui2)ogP@lkbb4{9H%0KGXD=cm3Rdb%*KQ(X243F#9>3rB{k}i%=FIfPp}|vw z9LEinr*wnu!|@tOu>aX_ZIf*$X|YCU$vkbE0p>KD)G;W#<^ndbX|FEt;xUfv=bdVe z)+(1&i@1UrV}!`{8JpwACL-Uo7BK~Nyx@3w{>%1L9yoTMpUYHW#V_E7Gqo1r*|q7a zwYF&GY<^-Kj72JQ;9_cm$X)V6HOliHzbZS&*CG!(5W1M>_e9kyGoU~M3^D>tT2O{S zMgmHu6-5~Z5=2mhl8B@vQq+{BLI}Da&!PqPylUvBZY*Zy`39xFDvHf!Q)s3H5-f-) zm&?UIBq_-d$#B)9W|Z{8k)8(~hgRVD)FB>-J(_j0Li0RRx|f3MS1S9Cy|7y-Rx&X% zeGv&zblo_w4mzX;K9F%JI;^hxSTt}*RsxIlV}7JZX0hRGnBWF7{|y&-3g? zupL{?XsL``)a7(GB_mXXSuG8VIiw&|$Ydp$>T%0nNKMbeJ+5=W%^b;93jsDM395uF z^}09HAe4j+;)B9$22@PT@nSnJZC5D{oU7O_1;hoN+NjPy@nh`}Wg$XJ8Y&W$vj}Nv zxui{MX)T*8rLsEHzQ?r>$@{-tk%n%!`c^;^q5|l6>sk4PpH5?Zjpu*O%ao2lwu*KY70# OKfrQvTHl(ya_tY@TS5^4 literal 0 HcmV?d00001 diff --git a/src/assets/images/server.png b/src/assets/images/server.png new file mode 100644 index 0000000000000000000000000000000000000000..e28417c7ff650355b8e63e8726e3e3b9bf2c30e0 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxWP_E{-7;bCUl2|8LK% zCm3Ul-t7$@r)x4pk!#~e9-<0)nq0Y~O*u~x?q z7<2AU6JX#_Xo{N<{fT|OI0F+$UPDt8Qy8m&e#hdD&Ti!&42&(Nn)VeR81%krw6VTu z4cCzJpJT!3e+npJZhVj@DK+)z1rBB)?C_k+}|Y_9h%`@{4)Jz|^61R)I&rK_rtcv4LTcg%l%GN0L4Ri@?!F4grUXzwSMX z42(xST;d%3Jc2K(0%cn}60EqF9^T-|#3Ep*cYqsc#G?!r4g-eyPfe8kGrJvtu4M3Z L^>bP0l+XkK3L8!a literal 0 HcmV?d00001 diff --git a/src/assets/images/sign.png b/src/assets/images/sign.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8573ceffab5aef9d2417b6e5aeab7ce89b7604 GIT binary patch literal 681 zcmV;a0#^NrP)P000>X1^@s6#OZ}&0007TNkl1we^xo3arX@&0OVAC0L=#|POdxJ_V`7Z|#J}KwaOqN)E)5ALMiwdfHOESfh%;UxP)BaA; zG%e(&N+94T77g`XU|(&cs5+t#d;$!_BLF?~E<|psJbAiGek{wv)yck))wLqeSH6%L z@DU9O+`c&j&@=BsEE^Qfrd(_BVPluk;RK0zn8MZ`TH7QV5{O1Z3}q5-Sks+T-rlJK zPQFt+6k=LXku556osXM!?%tSU@?x09e@@?%+sGTmLuEgQLI^YTpraPmWH zA4oJ3V19PooyewR0L)D1P*j~{RA4aa)Gp)(nWyWGhXnwdE!)i<3W-I6%+HN`471at zo?1SaBA-in>b>Ouy-?h#vhuFL?Bxk^=h7^_SVwNE0E`T$nY%LKdSAaS@V!*!`n4$l zo-MC?JcmMb!=x@L=!OY6x2`TJ0Pb;hq^KHoNx`x#0P2$B@%#cQSND1F=v8+C&1v9H z&7xd$fEDQno7-g?ibX@|HduG2*{YbtlU8qtC<}BPthCPzVp_J-_-HsV zb(Hze!lkv&SW< P00000NkvXXu0mjfdR0DT literal 0 HcmV?d00001 diff --git a/src/assets/images/sign_home.png b/src/assets/images/sign_home.png new file mode 100644 index 0000000000000000000000000000000000000000..5ecfcec81e6cad5fc313180680c6be12c2beb2cc GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;Uj1_nkYPZ!6KiaAMt{{OdU zHYzA8auRi5`u*)~vWqw~hk{s1@9F9K$Ct{lW4o!)z>vhS^T5T6AOClY>mT@We}BD& zp~t^hS63@I|6~4Y((r|eMSyz~Z&Ff{hMAF}p&^55Q>FmJ#{2tfyBD!3G(6b0_%_=n z*0#iLhn`G`WfXAmx$%cGom|kKsuQjJhyq9Twbkt5*V@!p00i_>zopr09P!IrT_o{ literal 0 HcmV?d00001 diff --git a/src/assets/images/sign_sign.png b/src/assets/images/sign_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..5eae09b9852c15a228489fd8975833c01dfdd43e GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;Uj1_nkePZ!6KiaAMt{{Odc zo;>+-J)6+MeYL+O98DY;Ha3_<|J&uc}S$SF|=agv+zm$k^u=l$?0*=yje287v$MVkwR(A6~uA=kdM405q;4NJ-$2`*F@+ zi~jEoVL2di#BDnJt$PfYxCI<~0+^d?Nt+5MUE$(?40hs*|*2|;-b7eW3A zH7{E(-;n9V#=zJj$i0NAf#J|grUlm}9PcTl0L^~*mFa{)LSF8H+-J)6+MeYL+O98DY;Ha3{}&opYy=sk4kP{OQ<6F=@>yf|4ID1Ja?%9JS`W=|d; z?=LU|@)f*OQd13WDn2wkyu93>r>d%o=khY&WDgIIga?lvCH?sJR{HSj@bwbga&NaK zNjNYplwi2jz$c~?(Qw_Af$>PonU9}7G2P}!R_;D{o z!f54C^owzZS_;q_iH#0g3>*q`^cbpo1)uObu`#d+#OXKiFh0A+R+GiR#KW-QcwK>6 TNoo=>#2GwY{an^LB{Ts5surOk literal 0 HcmV?d00001 diff --git a/src/assets/images/sign_warp.png b/src/assets/images/sign_warp.png new file mode 100644 index 0000000000000000000000000000000000000000..9f05e517e1b8a5ddbc1047402682e38801df5fc5 GIT binary patch literal 435 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 DumVSe literal 0 HcmV?d00001 diff --git a/src/assets/images/weather_stormy.png b/src/assets/images/weather_stormy.png new file mode 100644 index 0000000000000000000000000000000000000000..45808fb140cdc8742683a387a07153634a537033 GIT binary patch literal 1285 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/weather_stormy_night.png b/src/assets/images/weather_stormy_night.png new file mode 100644 index 0000000000000000000000000000000000000000..fe08ba889f8a0bfd7e0a12efd947fd557bf1d9d2 GIT binary patch literal 2968 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/weather_sunny.png b/src/assets/images/weather_sunny.png new file mode 100644 index 0000000000000000000000000000000000000000..8ef8cbdaec0adfcc3c1dfe1330b190c21e0d44b6 GIT binary patch literal 905 zcmV;419tq0P)P000*V1^@s6{^R5m0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#D@jB_RCwC#R7+12Q562}%(P4ypy=={ z3Kirbno{F)fl^%|X=F-jpm(Ljq( z-jCKgrOe}cr=_)&RyXR(lbqa{Gv|Kao%5Y@$&H)0kjW^e8RHM71`OCL<2j8-?fu51 z;8E_B{Z&q1a92ZpGOy#a63<~yrUHQ!@~hSx;WcHm-4{o z&cEPuesfI@n+Lq|QAuKv$*DkA!0G9kA-1^JUwce<4WIK_T(ZX?j&?{}3yHc2YApo~ zg+OQL`VjWFTeh$GmKy!ROQUOXlCP6f83|@)W}75Q@;aTB;CUXANCeBvD+mvsN9pzo z$kGfbp95Hm0d*N9x(JBXfD(lE&R6*D>|l`NI1oa>nZK6FP0P!ZVg#nyY&JL?<)}H+ zi?Fa4?^g~(m0MwKIRYx51}$m@R=Jw`*F4ze}@PGx10_Jf4p!r+|l)e+*QC*u1A6Ce&Y%zXN)aHWd||-t^-sp0MWysQKm^`2_&e1RJjUm$47gjlpafx=(^s` z%HgT2t$|s`1aPKSPP{6iQHUgp(0mA6M2!)xffyP)6-&?sP$G9}njX_c@cH~LJTJ7> zRPTtN+%S-7MAFH01|U~m!-5jPn12xJVn2$-2r5v5+-;03y3o$jp2alLbiGZM<@iS3 z*a(~`65SjV3wFlbw6faEh<=~M{K$O_j6Fx$hl!Ohx0l+Q?~-^6_da<#)KFjN&d<;L z?Zjuh1yaLNWgZ`%-h(1oy(rx0Idt$qkkd5H$uxAZ#jh>Wt8AVx;NDWWf5B)lIUA`6rFTKd}EK f|4IIy{SaUP?0FoMp=4%e00000NkvXXu0mjf<$|<~ literal 0 HcmV?d00001 diff --git a/src/assets/images/weather_sunny_day.png b/src/assets/images/weather_sunny_day.png new file mode 100644 index 0000000000000000000000000000000000000000..94ce5b077ec74f98c0d50e4d459b43a6c4050332 GIT binary patch literal 2385 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/weather_thunder.png b/src/assets/images/weather_thunder.png new file mode 100644 index 0000000000000000000000000000000000000000..07bbfc0a4766796f99f1faa69f226c949ecf9540 GIT binary patch literal 627 zcmV-(0*w8MP)P000*V1^@s6{^R5m0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!6-h)vRCwBA{Qv(y1FZoQ10BGqC8L&% zT0$7GkfOM_q+DN+|JwyY{_j}jpS|Q``0Va*aV-?FCi~ z<}SCm0AwyeFRDllE(HO;?+pL`F{0q7FZdZ|FSGpc?K@k5xrN2Yix)35fG}CX1+qk3 z_!GmwzX*Z%pST$2EVBRw(*l^-hmRl0j}w00?+(BJpn9H%>jy(z@F|7|PlO5{0`bN3 zhaUX+$#wuJwIM7da3jf<{QSl8Vf%hf0XeC63?R(T{s$~BB=8xGjdUJ@eY@v~M#7m( z3Iaej>6WCV<_k`lGR^+vJL`M z&%vovr}wk7{51IXl?mochT|928E)Q}T9BNanD|OSj=VUzeEAB*wFeLJb8~)AkP>;$ z@cA<%!>>Oq40}%+0}}ynLTXC#LV0;vhO^IqlV{15D_7z9MN;^=!23@O44=R9GMu}i z_u<6_B@==6rQ{iVYqhRZAiMwo literal 0 HcmV?d00001 diff --git a/src/assets/images/weather_thunder_day.png b/src/assets/images/weather_thunder_day.png new file mode 100644 index 0000000000000000000000000000000000000000..89005210e0019ee5f95221735eafa6a30a560f9b GIT binary patch literal 2818 zcmZuzc{J4PAO4aVgQ`eAV<;s%myX-rmYbmaf z$cXGFlxQJo6h_8xy64>ge&_u>pXZ#!$!4kF zfPmROfJ)tF6WHlbV*`No`+R}DiDgfCC?<9RY&Q89Mnj(3zlXt;i#OOT^)C{bdHDdq zD~dC?Xl>h9X5&e*{vaCpG+>^-t~$#FK_Z5XPDmkB6SGpp#%wwNiXJoVel>H&7nC~w zu1L>nAlCb&s8JKxJGI1;OH9_pA~s%yCllZhM379>)Mrw>nsdAJwb~nWNS7@PnrI{0 zd!rfwqx)U7eeJ~^fpG4EC{|cpANiZ6uMJW4TEn!67!=IihjPHezosCoa>!ZwX~?5j z6ok_=GTseFFUUR#-}4XccKoJUC?P0lm6MicsTsaY@ia4o5{M@q8#03f19u&irYr81 zq%#j#=iS}iZU6TFpeRW470N@AISmMA?XzCF1Idy)TI%YTB}GJx1OJc!dfspGCl8kL z-PXGfK|H`qTRBPb!?gU~J}+@8L=Ye~j1e;Ah&JJL%K@9pK@cPu7}^)@V%Mm^SFqNLf_`D_ z!Erd;N!ONH`piryL)5m}nFkC8OCx1uqOdM6(+TX`qI5kW!`*{Ow&5104dH>R?#_6~ z-FmsQC!d7^gM&Q|4h}jYh==LpSK`T|ZaL+(b}g$^P`P>GeI}Ett)X!^<`@{(GwST#2{+pMmvJpZnltSc2wLc!`X_&JG01nvX`!Oz73AB;E`wsMu93kC(- z*4aGo?-!_<^l*ihr&!7piNwi~EcC5YI+1WV0F~5+g$Bt-ooQciZ* z|M5!`V!EYC8r!}eKRDo^zPFeM!cP>ri^1aWrmbL)8I=my)C9%#JIRf_dewb`8|ZdC z4iuD>lt?G^p~pR1jiQ8`u1WC&K$e*_+hIe36z+ry{s@ghI4fJmj#pfYTVg%&j*DGo z^&ifxUwcLAjtI)hr$@Mtt)I^}D{X0R9#<6RgT==nagf`3DK4UDGlHKbt(XT$xrMnoDtYs5w|(BF8!`w35Ty*nIHk$q zDui-r%zUke@Pys&Z%JN1*e;>k9XUt zeW)YKm(kpw5x%D`BzZJUdq%E`pdU!yZ2XwXQ=U=WU9WsjeM58>wO_n(JHKvHM(nUG)q9wJ=VHa$1Ph=9^o1RM-@K2QelGdpwr zqgWH;^{c(pJ&hdS1~JTqgMuAaQiK@g=MvK;ogDP1>g4{z^6Eu=(MQ&qthSV*J)!Id z@WZs5g<;NHk_F7AgSCR(G%yBh27PwU+LuQ)4t%SrOTaGOBG0?GNqF(<+I4;J;?esI zRuOD;e9#V?k4}#Ij(A2kiqRk?hs3Wbb%jnOB8~t`n?Q!pvr&(`Pwir6hUKiyEa&FH z!yk&;J6XG#HzE&nXjWk}N58$1eGSvvF7;bmSzoA2)Lscuue(%$2%44Z36oQlBsH_i#ircI|WB6%u&}vmkM3>8GTVh4QMnvHK z4Fs^xXO1lChC3_`@4uaA4m>iw-wy?tzNaSCCH|?gPysl6#bZxj-|teQJUTd`^+ha7 zY;0r#iO$L?)Y%wM-&%w2%X`*@*xc9L?>Q4u<*DW`GM1A`t*)Z8GLNo>$jg7`xT90~ zP8_7}9dHqqrL|v^bf}n3cURu+S&yjlcexF-$rBeLig$LZd|A}-lDBVsH*RfIwih>M zJf|a``Xf2{S5QSxzdZjazQ}QH$DWhC4Uob}c75;7>r;Q4b*zOe)H{%}r)cn&=>`}R zObYtt5wJMLJ=L}$nf*;;BGJ6xtl7>)TQ^Sf^Z`B!6Zmnw|@J^_~U zi{t-#n6W3%;s&Pz}T^JrTsu6=} z!Kh5BqFOO10JyjT5;XONLjF^F`#QV3hW#HU1dVCLs5D_z$Np2cf{uru+oQ3S0M77| JLA@R+_J1M#Ai4km literal 0 HcmV?d00001 diff --git a/src/assets/images/weather_thunder_night.png b/src/assets/images/weather_thunder_night.png new file mode 100644 index 0000000000000000000000000000000000000000..63b359e99601920e2f63809667af38dd5146935d GIT binary patch literal 2898 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 K=d#Wzp$Pz;7k-2Q literal 0 HcmV?d00001 diff --git a/src/assets/images/window_close_hover.png b/src/assets/images/window_close_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..08656f6af74f90239fcc112f05fa9d1b8333709a GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxSqyE{-7;bCUl2|8MVX zrTn;_&FH|H|NkW!nL1dPL<*mHs1*3wT!HN+D~E!Zz;ks0@5zr@6c{)Z)Qr9!WOQIi zlt}pgh_(6s_xBQ9j!6oZB@6-%5^Q^Fe~YbSj5OXPV+2$xR?@io)-8ueTFsLt2{oHd zXltzg{?75q1qP7zhMbNK8w}#kDgZT#uqy$DN*T|bSD5X{@I+R1!HqOOKc1}&j4cnD zQqC%*HyfN$$l1sYv_kL4kB`b0TPFVPkyAUtpwM8zW1*thcsAUESx})tgU_Xbfob;x rTY>w^fy&lX*fufpsw zt%<>b!EoXdZf*t+g)UwcVh>x*uP>ZE9~m1M4rMZIa;s@$U=avoPLOg4aWUPQjiIp%$Mn#iRXMxA{y$qZkAQ=Y!nxPi*GtZ`tM!`1xNO<7 z1Sy4v86KBfSs7RaxOW|xYhCW($Gq9q)wQteAcF%#;2Wj}hDA3RuoH(mj&0As-(;w0 zD8ay?z{7mz>{&yRMB!#ekaBJYMwYUJ{qpt_OO`J6yu@+JM}a}Wp=U~3dIJM9!zx9i UWuNrsgM7f?>FVdQ&MBb@04R-P-2eap literal 0 HcmV?d00001 diff --git a/src/assets/images/window_pinned_hover.png b/src/assets/images/window_pinned_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f963d2abc69ced69a46b837a4c1430e0770dd4 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxU*bE{-7;bCUl2|8LKn zZ1uRF&FH}Yng1mjnK~va_CB<4R-16#bgcq| zdFf3_g#!!=ziYfz)-5^;bU1^j LtDnm{r-UW|ufpsw zt%<>b!EoXdZf*t+g)UwcVh>x*uP>ZE9~m1M4rMZIa;s@$U=avoPLOg4aWUPQjiIp%$Mn`xb7liW(xO!> zBN!YQF5Y1RaunCFFzwm1C*a5JZMn)`@(v6WpES4g%QqQnGAJ};$hj~ux)gIWFm*f= zV_*@u=Hb>KkaRVnyP|>N(9Et6u4-nMm6erivKWC199aY$ENUChx*AM>T%>EpAm9+8 zdq8a3lQfeChDDVEj4T3Ybs0DmW<>*KT*S*19K4gTe~DWM4fP8EF? literal 0 HcmV?d00001 diff --git a/src/assets/images/zoom_out.png b/src/assets/images/zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..9af74b2d1a2895f9fe062eb8f9ec40fc662c9bec GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`)Ym%P6qN7l0AZa z85pWm85kOx85n;42huMX7)lKo7+xhXFj!4zU=YurzH;UjpxWD>E{-7;bCUl2|8L*C zZ{NRqHmQbgaeX5u76I-PAC%quE*z?1b8|cPpMmiR)8h}HJ_TL`xb7liW(xO!> zBN!YQF5Y2kU|6)1m4VTvn45vA +
+ + +
+ + + + + \ No newline at end of file diff --git a/src/components/Map.vue b/src/components/Map.vue deleted file mode 100644 index a6608d2..0000000 --- a/src/components/Map.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/PlayerList.vue b/src/components/PlayerList.vue index 39fe14a..e9fb0e5 100644 --- a/src/components/PlayerList.vue +++ b/src/components/PlayerList.vue @@ -1,27 +1,34 @@ - \ No newline at end of file diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue index 78bc349..3f72479 100644 --- a/src/components/Sidebar.vue +++ b/src/components/Sidebar.vue @@ -2,154 +2,26 @@
- diff --git a/src/components/WorldList.vue b/src/components/WorldList.vue new file mode 100644 index 0000000..7c1328b --- /dev/null +++ b/src/components/WorldList.vue @@ -0,0 +1,34 @@ + + + + + \ No newline at end of file diff --git a/src/components/WorldListItem.vue b/src/components/WorldListItem.vue new file mode 100644 index 0000000..af34bdb --- /dev/null +++ b/src/components/WorldListItem.vue @@ -0,0 +1,62 @@ + + + + + \ No newline at end of file diff --git a/src/components/map/layer/MapLayer.vue b/src/components/map/layer/MapLayer.vue new file mode 100644 index 0000000..ef11b66 --- /dev/null +++ b/src/components/map/layer/MapLayer.vue @@ -0,0 +1,85 @@ + + + \ No newline at end of file diff --git a/src/components/map/layer/PlayersLayer.vue b/src/components/map/layer/PlayersLayer.vue new file mode 100644 index 0000000..9beab9e --- /dev/null +++ b/src/components/map/layer/PlayersLayer.vue @@ -0,0 +1,41 @@ + + + + + \ No newline at end of file diff --git a/src/components/map/marker/PlayerMarker.vue b/src/components/map/marker/PlayerMarker.vue new file mode 100644 index 0000000..0db7c1c --- /dev/null +++ b/src/components/map/marker/PlayerMarker.vue @@ -0,0 +1,33 @@ + + + \ No newline at end of file diff --git a/src/dynmap.d.ts b/src/dynmap.d.ts new file mode 100644 index 0000000..0047356 --- /dev/null +++ b/src/dynmap.d.ts @@ -0,0 +1,154 @@ +import {ControlPosition, LeafletMouseEvent} from "leaflet"; + +declare global { + interface Window { + config: DynmapConfig + } +} + +type DynmapConfig = { + url: DynmapUrlConfig; +}; + +type DynmapUrlConfig = { + configuration: string; + update: string; + sendmessage: string; + login: string; + register: string; + tiles: string; + markers: string; +} + +interface DynmapServerConfig { + version: string; + allowChat: boolean; + chatRequiresLogin: boolean; + chatInterval: number; + defaultMap?: string; + defaultWorld?: string; + defaultZoom?: number; + followMap?: string; + followZoom?: number; + updateInterval: number; + showLayerControl: boolean; + title: string; + loginEnabled: boolean; + loginRequired: boolean; + maxPlayers: number; + hash: number; +} + +interface DynmapMessageConfig { + chatNotAllowed: string; + chatRequiresLogin: string; + chatCooldown: string; + mapTypes: string; + players: string; + playerJoin: string; + playerQuit: string; + anonymousJoin: string; + anonymousQuit: string; +} + +interface DynmapWorld { + seaLevel: number; + name: string; + protected: boolean; + title: string; + height: number; + center: Coordinate; + maps: Array; +} + +interface DynmapMap { + world: string; + background: string; + backgroundDay: string; + backgroundNight: string; + compassView: string; + icon: string; + imageFormat: string; + name: string; + nightAndDay: boolean; + prefix: string; + protected: boolean; + title: string; + type: string; + mapToWorld: [number, number, number, number, number, number, number, number, number]; + worldToMap: [number, number, number, number, number, number, number, number, number]; + nativeZoomLevels: number; + extraZoomLevels: number; +} + +interface Coordinate { + x: number; + y: number; + z: number; +} + +interface DynmapLocation { + x: number; + y: number; + z: number; + world?: string; +} + +interface DynmapConfigurationResponse { + config: DynmapServerConfig, + messages: DynmapMessageConfig, + worlds: Array, +} + +interface DynmapUpdateResponse { + configHash: number; + playerCount: number; + raining: boolean; + thundering: boolean; + timeOfDay: number; + players: Array; + timestamp: number; + //TODO: Tiles etc +} + +interface DynmapPlayer { + account: string + armor: number + health: number + name: string + sort: number + location: DynmapLocation; +} + +declare module 'leaflet' { + namespace Control { + function extend(props: T): { new(...args: any[]): T } & typeof Control; + + class CoordinatesControl extends Control { + constructor(options: CoordinatesControlOptions); + + options: CoordinatesControlOptions + _coordsContainer?: HTMLElement + _regionContainer?: HTMLElement + _chunkContainer?: HTMLElement + _map?: L.Map + + _onMouseMove(event: LeafletMouseEvent): void + + _onMouseOut(event: LeafletMouseEvent): void + + _update(): void + + } + + interface CoordinatesControlOptions { + showY: boolean + showRegion: boolean + showChunk: boolean + label: string + position: ControlPosition + } + + function coordinatesControl(options: CoordinatesControlOptions): CoordinatesControl; + } +} diff --git a/src/leaflet/control/CoordinatesControl.js b/src/leaflet/control/CoordinatesControl.js new file mode 100644 index 0000000..e3bdc98 --- /dev/null +++ b/src/leaflet/control/CoordinatesControl.js @@ -0,0 +1,108 @@ +import L from 'leaflet'; + +L.Control.CoordinatesControl = L.Control.extend({ + options: { + showY: true, + showRegion: false, + showChunk: false, + label: 'x,y,z: ', + position: 'topleft', + }, + + _coordsContainer: undefined, + _regionContainer: undefined, + _chunkContainer: undefined, + + constructor(options) { + L.Util.setOptions(this, options); + }, + + onAdd(map) { + var container = L.DomUtil.create('div', 'coord-control'); + + if (!this.options.showY) { + container.classList.add('coord-control-noy'); + } + + this._coordsContainer = L.DomUtil.create('span', 'coord-control-value'); + this._coordsContainer.innerText = this.options.showY ? '---,---,---' : '---,---'; + this._coordsContainer.dataset.label = this.options.label; + container.insertAdjacentElement('beforeend', this._coordsContainer); + + if (this.options.showRegion) { + this._regionContainer = L.DomUtil.create('span', 'coord-control-value'); + this._regionContainer.innerText = '--------'; + container.insertAdjacentElement('beforeend', this._regionContainer); + } + + if (this.options.showChunk) { + this._chunkContainer = L.DomUtil.create('span', 'coord-control-value'); + this._chunkContainer.innerText = '---,---'; + this._chunkContainer.dataset.label = 'Chunk: '; + container.insertAdjacentElement('beforeend', this._chunkContainer); + } + + map.on('mousemove', this._onMouseMove, this); + map.on('mouseout', this._onMouseOut, this); + + this._update(); + return container; + }, + + remove() { + if (!this._map) { + return this; + } + + this._map.on('mousemove', this._onMouseMove, this); + this._map.on('mouseout', this._onMouseOut, this); + L.Control.prototype.remove.call(this); + + return this; + }, + + _onMouseMove(event) { + if (!this._map) { + return; + } + + var loc = dynmap.getProjection().fromLatLngToLocation(event.latlng, dynmap.world.sealevel + 1); + + if (this.options.showY) { + this._coordsContainer.innerText = Math.round(loc.x) + ',' + loc.y + ',' + Math.round(loc.z); + } else { + this._coordsContainer.innerText = Math.round(loc.x) + ',' + Math.round(loc.z); + } + + if (this.options.showRegion) { + this._regionContainer.innerText = 'r.' + Math.floor(loc.x / 512) + '.' + Math.floor(loc.z / 512) + '.mca'; + } + + if (this.options.showChunk) { + this._chunkContainer.innerText = 'Chunk: ' + Math.floor(loc.x / 16) + ',' + Math.floor(loc.z / 16); + } + }, + + _onMouseOut() { + if (!this._map) { + return; + } + + if (this.options.showY) { + this._coordsContainer.innerText = '---,---'; + } else { + this._coordsContainer.innerText = '---,---,---'; + } + + if (this.options.showRegion) { + this._regionContainer.innerText = '--------'; + } + + if (this.options.showChunk) { + this._chunkContainer.innerText = '---,---'; + } + }, + + _update() { + } +}); diff --git a/src/leaflet/control/LinkControl.js b/src/leaflet/control/LinkControl.js new file mode 100644 index 0000000..c1335fe --- /dev/null +++ b/src/leaflet/control/LinkControl.js @@ -0,0 +1,51 @@ +import L from 'leaflet'; + +const LinkControl = L.Control.extend({ + options: {position: 'bottomleft'}, + + onAdd: function (map) { + this._map = map; + this._container = L.DomUtil.create('div', 'dynmap-link'); + + this._linkButton = this._createButton( + 'Link', 'dynmap-link-button', this._follow, this); + + this._container.appendChild(this._linkButton); + return this._container; + }, + + getContainer: function () { + return this._container; + }, + + getPosition: function () { + return this.options.position; + }, + + _createButton: function (title, className, fn, context) { + var link = document.createElement('a'); + link.href = '#'; + link.title = title; + link.className = className; + link.onmouseover = function () { + link.href = dynmap.getLink(); + }; + + L.DomEvent.disableClickPropagation(link); + L.DomEvent.addListener(link, 'click', L.DomEvent.preventDefault); + L.DomEvent.addListener(link, 'click', fn, context); + + return link; + }, + + _follow: function () { + // var url = dynmap.getLink(); + // window.location = url; + } +}); + +// var link = new dynmapLink(); +// dynmap.map.addControl(link); +// } + +export default LinkControl; \ No newline at end of file diff --git a/src/leaflet/control/LogoControl.js b/src/leaflet/control/LogoControl.js new file mode 100644 index 0000000..a3787a0 --- /dev/null +++ b/src/leaflet/control/LogoControl.js @@ -0,0 +1,50 @@ +import L from 'leaflet'; + +const LogoControl = L.Control.extend({ + onAdd: function (map) { + this._container = L.DomUtil.create('div', 'leaflet-control-attribution'); + this._map = map; + this._update(); + return this._container; + }, + + getPosition: function () { + if (configuration.position == 'top-left') + return 'topleft'; + else if (configuration.position == 'top-right') + return 'topright'; + else if (configuration.position == 'bottom-left') + return 'bottomleft'; + else + return 'bottomright'; + }, + + getContainer: function () { + return this._container; + }, + + _update: function () { + if (!this._map) return; + var c = this._container; + if (configuration.linkurl) { + c = $('').attr('href', configuration.linkurl).appendTo(c)[0]; + } + if (configuration.logourl) { + $(c).append($('').attr('src', configuration.logourl).attr('alt', configuration.text).appendTo(c)[0]); + } else { + $(c).text(configuration.text); + } + } +}); +// +// dynmap.map.options.attributionControl = false; +// if (dynmap.map.attributionControl) { +// dynmap.map.removeControl(dynmap.map.attributionControl); +// dynmap.map.attributionControl = null; +// } +// var l = new Logo(); +// dynmap.map.addControl(l); +// } +// ; + +export default LogoControl; \ No newline at end of file diff --git a/src/leaflet/mapType/HDMapType.js b/src/leaflet/mapType/HDMapType.js new file mode 100644 index 0000000..71057ae --- /dev/null +++ b/src/leaflet/mapType/HDMapType.js @@ -0,0 +1,47 @@ +import DynmapTileLayer from "@/leaflet/tileLayer/DynmapTileLayer"; +import HDProjection from "@/leaflet/projection/HDProjection"; +import L from 'leaflet'; + +const HDMapType = DynmapTileLayer.extend({ + projection: undefined, + options: { + maxZoom: 1, + maxNativeZoom: 1, + worldName: '', + prefix: '', + errorTileUrl: 'images/blank.png', + }, + initialize(options) { + DynmapTileLayer.prototype.initialize.call(this, options); + options.zoomReverse = true; + options.tileSize = 128; + options.minZoom = 0; + L.Util.setOptions(this, options); + this.projection = new HDProjection(Object.assign(options, {map: this})); + }, + + getTileName: function(coords) { + let info = this.getTileInfo(coords); + // Y is inverted for HD-map. + info.y = -info.y; + info.scaledy = info.y >> 5; + return `${info.prefix}${info.nightday}/${info.scaledx}_${info.scaledy}/${info.zoom}${info.x}_${info.y}.${info.fmt}`; + }, + zoomprefix: function(amount) { + // amount == 0 -> '' + // amount == 1 -> 'z_' + // amount == 2 -> 'zz_' + return 'zzzzzzzzzzzzzzzzzzzzzz'.substr(0, amount) + (amount === 0 ? '' : '_'); + } +}); + +// maptypes.HDMapType = function(options) { return new HDMapType(options); }; + +const hdMapType = (options) => { + return new HDMapType(options); +} + +export { + HDMapType, + hdMapType +}; \ No newline at end of file diff --git a/src/leaflet/marker/PlayerMarker.js b/src/leaflet/marker/PlayerMarker.js new file mode 100644 index 0000000..dc3cd28 --- /dev/null +++ b/src/leaflet/marker/PlayerMarker.js @@ -0,0 +1,156 @@ +import L from 'leaflet'; + +const PlayerMarker = L.Marker.extend({ + options: { + smallFace: true, + showSkinFace: false, + showBody: false, + showHealth: false, + }, + + initialize: function (player, options) { + this._player = player; + options.draggable = false; + options.icon = new PlayerIcon(player, { + smallFace: options.smallFace, + showSkinFace: options.showSkinFace, + showBody: options.showBody, + showHealth: options.showHealth, + }); + + L.Util.setOptions(this, options); + //this._latlng = toLatLng(latlng); //TODO + }, +}); + +var PlayerIcon = L.DivIcon.extend({ + _player: null, + _container: null, + _playerImage: null, + _playerName: null, + + _playerHealth: null, + _playerHealthBg: null, + _playerHealthBar: null, + _playerArmourBg: null, + _playerArmourBar: null, + + options: { + smallFace: true, + showSkinFace: false, + showBody: false, + showHealth: false, + }, + + initialize: function (player, options) { + this._player = player; + L.Util.setOptions(this, options); + }, + + createIcon: function (oldIcon) { + if (oldIcon) { + L.DomUtil.remove(oldIcon); + } + + var player = this._player; + + this._container = document.createElement('div'); + + // var markerPosition = dynmap.getProjection().fromLocationToLatLng(player.location); + // player.marker.setLatLng(markerPosition); + + this._container.classList.add('Marker', 'playerMarker', 'leaflet-marker-icon'); + + this._playerImage = document.createElement('img'); + this._playerImage.classList.add(this.options.smallFace ? 'playerIconSm' : 'playerIcon'); + this._playerImage.src = 'images/player.png'; + + this._playerName = document.createElement('span'); + this._playerName.classList.add(this.options.smallFace ? 'playerNameSm' : 'playerName'); + this._playerName.innerText = player.name; + + this._container.insertAdjacentElement('beforeend', this._playerImage); + this._container.insertAdjacentElement('beforeend', this._playerName); + + if (this.options.showSkinFace) { + var that = this; + + if (this.options.smallFace) { + getMinecraftHead(player.account, 16, function (head) { + that._playerImage.src = head.src; + }); + } else if (this.options.showBody) { + getMinecraftHead(player.account, 'body', function (head) { + that._playerImage.src = head.src; + }); + } else { + getMinecraftHead(player.account, 32, function (head) { + that._playerImage.src = head.src; + }); + } + } + + if (this.options.showHealth) { + this._playerHealth = document.createElement('div'); + + this._playerHealth.classList.add(this.options.smallFace ? 'healthContainerSm' : 'healthContainer'); + this._container.insertAdjacentElement('beforeend', this._playerHealth) + + this._playerHealthBar = document.createElement('div'); + this._playerHealthBar.classList.add('playerHealth'); + + this._playerArmourBar = document.createElement('div'); + this._playerArmourBar.classList.add('playerHealth'); + + this._playerHealthBg = document.createElement('div'); + this._playerArmourBg = document.createElement('div'); + + this._playerHealthBg.classList.add('playerHealthBackground'); + this._playerArmourBar.classList.add('playerArmorBackground'); + + this._playerHealthBg.insertAdjacentElement('beforeend', this._playerHealthBar); + this._playerArmourBg.insertAdjacentElement('beforeend', this._playerArmourBar); + + this._playerHealth.insertAdjacentElement('beforeend', this._playerHealthBg); + this._playerHealth.insertAdjacentElement('beforeend', this._playerArmourBg); + + this._playerHealth.hidden = true; + } else { + this._playerName.classList.add('playerNameNoHealth'); + } + + return this._container; + + // var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'), + // options = this.options; + // + // if (options.html instanceof Element) { + // empty(div); + // div.appendChild(options.html); + // } else { + // div.innerHTML = options.html !== false ? options.html : ''; + // } + // + // if (options.bgPos) { + // var bgPos = toPoint(options.bgPos); + // div.style.backgroundPosition = (-bgPos.x) + 'px ' + (-bgPos.y) + 'px'; + // } + // this._setIconStyles(div, 'icon'); + // + // return div; + }, + + update() { + this._playerName.innerText = this.player.name; + + if (this.options.player.health !== undefined && this.options.player.armor !== undefined) { + this.options.player.healthContainer.hidden = false; + this._this.options.playerHealthBar.style.width = Math.ceil(this.options.player.health * 2.5) + 'px'; + this._this.options.playerArmourBar.style.width = Math.ceil(this.options.player.armor * 2.5) + 'px'; + } else { + this.options.player.healthContainer.hidden = true; + } + } +}); + +export default PlayerMarker; \ No newline at end of file diff --git a/src/leaflet/projection/DynmapProjection.js b/src/leaflet/projection/DynmapProjection.js new file mode 100644 index 0000000..d637a38 --- /dev/null +++ b/src/leaflet/projection/DynmapProjection.js @@ -0,0 +1,15 @@ +import L from 'leaflet'; + +const DynmapProjection = L.Class.extend({ + initialize: function (options) { + L.Util.setOptions(this, options); + }, + fromLocationToLatLng: function () { + throw "fromLocationToLatLng not implemented"; + }, + fromLatLngToLocation: function () { + return null; + } +}); + +export default DynmapProjection; \ No newline at end of file diff --git a/src/leaflet/projection/HDProjection.js b/src/leaflet/projection/HDProjection.js new file mode 100644 index 0000000..c3bf9cc --- /dev/null +++ b/src/leaflet/projection/HDProjection.js @@ -0,0 +1,25 @@ +import DynmapProjection from "@/leaflet/projection/DynmapProjection"; +import L from 'leaflet'; + +const HDProjection = DynmapProjection.extend({ + fromLocationToLatLng: function (location) { + var wtp = this.options.worldtomap; + var lat = wtp[3] * location.x + wtp[4] * location.y + wtp[5] * location.z; + var lng = wtp[0] * location.x + wtp[1] * location.y + wtp[2] * location.z; + + return new L.LatLng( + -((128 - lat) / (1 << this.options.mapzoomout)), + lng / (1 << this.options.mapzoomout), + true); + }, + fromLatLngToLocation: function (latlon, y) { + var ptw = this.options.maptoworld; + var lat = latlon.lng * (1 << this.options.mapzoomout); + var lon = 128 + latlon.lat * (1 << this.options.mapzoomout); + var x = ptw[0] * lat + ptw[1] * lon + ptw[2] * y; + var z = ptw[6] * lat + ptw[7] * lon + ptw[8] * y; + return {x: x, y: y, z: z}; + } +}); + +export default HDProjection; diff --git a/src/leaflet/tileLayer/DynmapTileLayer.js b/src/leaflet/tileLayer/DynmapTileLayer.js new file mode 100644 index 0000000..0987c68 --- /dev/null +++ b/src/leaflet/tileLayer/DynmapTileLayer.js @@ -0,0 +1,128 @@ +import L from 'leaflet'; + +const DynmapTileLayer = L.TileLayer.extend({ + options: { + worldName: '', + prefix: '', + }, + + _cachedTileUrls: null, + _namedTiles: null, + + initialize(options) { + L.TileLayer.prototype.initialize.call(this, options); + this._cachedTileUrls = {}; + this._namedTiles = {}; + L.Util.setOptions(this, options); + }, + + getProjection: function () { + return this.projection; + }, + + getTileName: function() { + throw "getTileName not implemented"; + }, + + getTileUrl: function (coords) { + var tileName = this.getTileName(coords, coords.z), + url = this._cachedTileUrls[tileName]; + + if (!url) { + let path = escape(`${this.options.worldName}/${tileName}`); + url = `${window.config.url.tiles}${path}`; + this._cachedTileUrls[tileName] = url; + } + + return url; + }, + + updateNamedTile: function (name) { + var tile = this._namedTiles[name]; + delete this._cachedTileUrls[name]; + + if (tile) { + tile.src = this._cachedTileUrls[name] = this.options.dynmap.getTileUrl(name); + } + }, + + createTile(coords, done) { + var tile = L.TileLayer.prototype.createTile.call(this, coords, done), + name = this.getTileName(coords); + + tile.tileName = name; + + // console.log("Adding " + tile.tileName); + this._namedTiles[name] = tile; + + return tile; + }, + + // stops loading all tiles in the background layer + _abortLoading: function () { + var i, tile; + for (i in this._tiles) { + if (!Object.prototype.hasOwnProperty.call(this._tiles, i)) { + continue; + } + + tile = this._tiles[i] + + if (tile.coords.z !== this._tileZoom) { + if (!tile.complete && tile.el && tile.el.tileName) { + // console.log("Aborting " + tile.el.tileName); + delete this._namedTiles[tile.el.tileName]; + } + } + } + + L.TileLayer.prototype._abortLoading.call(this); + }, + + _removeTile: function (key) { + var tile = this._tiles[key]; + + if (!tile) { + return; + } + + var tileName = tile.el.tileName; + + if (tileName) { + // console.log("Removing " + tileName); + delete this._namedTiles[tileName]; + delete this._cachedTileUrls[tileName]; + } + + L.TileLayer.prototype._removeTile.call(this, key); + }, + + // Some helper functions. + zoomprefix: function (amount) { + return 'zzzzzzzzzzzzzzzzzzzzzz'.substr(0, amount); + }, + + getTileInfo: function (coords) { + // zoom: max zoomed in = this.options.maxZoom, max zoomed out = 0 + // izoom: max zoomed in = 0, max zoomed out = this.options.maxZoom + // zoomoutlevel: izoom < mapzoomin -> 0, else -> izoom - mapzoomin (which ranges from 0 till mapzoomout) + var izoom = this._getZoomForUrl(); + var zoomoutlevel = Math.max(0, izoom - (this.options.maxZoom - this.options.maxNativeZoom)); + var scale = 1 << zoomoutlevel; + var x = scale * coords.x; + var y = scale * coords.y; + return { + prefix: this.options.prefix, + nightday: (this.options.nightandday && this.options.dynmap.serverday) ? '_day' : '', + scaledx: x >> 5, + scaledy: y >> 5, + zoom: this.zoomprefix(zoomoutlevel), + zoomprefix: (zoomoutlevel == 0) ? "" : (this.zoomprefix(zoomoutlevel) + "_"), + x: x, + y: y, + fmt: this.options['image-format'] || 'png' + }; + } +}); + +export default DynmapTileLayer; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index b66c527..cd4f023 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,13 @@ import { createApp } from 'vue' import App from './App.vue' -import store from "@/store"; +import {store} from "@/store"; -const app = createApp(App); -app.use(store).mount('#mcmap'); \ No newline at end of file +import 'leaflet/dist/leaflet.css'; +import 'normalize-scss/sass/normalize/_import-now.scss'; +import './assets/css/dynmap_style.css'; +import './assets/css/rtgame.css'; + +const app = createApp(App).use(store); + +app.config.performance = true; +app.mount('#mcmap'); \ No newline at end of file diff --git a/src/store.ts b/src/store.ts deleted file mode 100644 index b45dc8e..0000000 --- a/src/store.ts +++ /dev/null @@ -1,20 +0,0 @@ -import {createStore} from 'vuex' - -const store = createStore({ - state() { - return { - servers: [], - worlds: [], - maps: [], - players: [], - - following: null, - - currentServer: null, - currentWorld: null, - currentMap: null, - } - } -}); - -export default store; \ No newline at end of file diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000..091bdf5 --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,326 @@ +import { + createStore, + Store as VuexStore, + createLogger, + MutationTree, + ActionContext, ActionTree, GetterTree, CommitOptions, DispatchOptions, +} from 'vuex'; +import API from './../api'; +import { + DynmapConfigurationResponse, + DynmapMap, + DynmapMessageConfig, + DynmapPlayer, + DynmapServerConfig, + DynmapUpdateResponse, + DynmapWorld +} from "@/dynmap"; + +// Mutations +export enum MutationTypes { + SET_CONFIGURATION = 'setConfiguration', + SET_MESSAGES = 'setMessages', + SET_WORLDS = 'setWorlds', + ADD_WORLD = 'addWorld', + SET_TIME_OF_DAY = 'setTimeOfDay', + SET_RAINING = 'setRaining', + SET_THUNDERING = 'setThundering', + SET_UPDATE_TIMESTAMP = 'setUpdateTimestamp', + INCREMENT_REQUEST_ID = 'incrementRequestId', + SET_PLAYERS = 'setPlayers', + SET_CURRENT_MAP = 'setCurrentMap', +} + +export enum ActionTypes { + LOAD_CONFIGRUATION = "loadConfiguration", + GET_UPDATE = "getUpdate", +} + +export type CurrentMapPayload = { + world: string + map: string +} + +export type Mutations = { + [MutationTypes.SET_CONFIGURATION](state: S, config: DynmapServerConfig): void + [MutationTypes.SET_MESSAGES](state: S, messages: DynmapMessageConfig): void + [MutationTypes.SET_WORLDS](state: S, worlds: Array): void + [MutationTypes.ADD_WORLD](state: S, world: DynmapWorld): void + [MutationTypes.SET_TIME_OF_DAY](state: S, time: number): void + [MutationTypes.SET_RAINING](state: S, raining: boolean): void + [MutationTypes.SET_THUNDERING](state: S, thundering: boolean): void + [MutationTypes.SET_UPDATE_TIMESTAMP](state: S, time: Date): void + [MutationTypes.INCREMENT_REQUEST_ID](state: S): void + [MutationTypes.SET_PLAYERS](state: S, players: Array): void + [MutationTypes.SET_CURRENT_MAP](state: S, payload: CurrentMapPayload): void +} + +const mutations: MutationTree & Mutations = { + [MutationTypes.SET_CONFIGURATION](state: State, config: DynmapServerConfig) { + state.configuration = Object.assign(state.configuration, config); + }, + [MutationTypes.SET_MESSAGES](state: State, messages: DynmapMessageConfig) { + state.messages = Object.assign(state.messages, messages); + }, + + [MutationTypes.SET_WORLDS](state: State, worlds: Array) { + state.worlds.clear(); + state.maps.clear(); + + state.configuration.followMap = undefined; + state.configuration.followZoom = undefined; + state.configuration.defaultMap = undefined; + state.configuration.defaultWorld = undefined; + + state.currentMap = undefined; + state.currentWorld = undefined; + state.following = undefined; + + state.timeOfDay = 0; + state.raining = false; + state.thundering = false; + + worlds.forEach(world => { + state.worlds.set(world.name, world); + world.maps.forEach(map => state.maps.set([world.name, map.name].join('_'), map)); + }); + }, + + [MutationTypes.ADD_WORLD](state: State, world: DynmapWorld) { + state.worlds.set(world.name, world); + }, + + [MutationTypes.SET_TIME_OF_DAY](state: State, time: number) { + if (time < 0 || time > 24000) { + throw new RangeError("Time must be between 0 and 24000"); + } + + state.timeOfDay = time; + }, + + [MutationTypes.SET_RAINING](state: State, raining: boolean) { + state.raining = raining; + }, + + [MutationTypes.SET_THUNDERING](state: State, thundering: boolean) { + state.thundering = thundering; + }, + + [MutationTypes.SET_UPDATE_TIMESTAMP](state: State, timestamp: Date) { + state.updateTimestamp = timestamp; + }, + + [MutationTypes.INCREMENT_REQUEST_ID](state: State) { + state.updateRequestId++; + }, + + [MutationTypes.SET_PLAYERS](state: State, players: Array) { + const existingPlayers: Set = new Set(); + + players.forEach(player => { + existingPlayers.add(player.account); + + if (state.players.has(player.account)) { + const existing = state.players.get(player.account); + + existing!.health = player.health; + existing!.armor = player.armor; + existing!.location = player.location; + existing!.name = player.name; + existing!.sort = player.sort; + } else { + state.players.set(player.account, { + account: player.account, + health: player.health, + armor: player.armor, + location: player.location, + name: player.name, + sort: player.sort, + }); + } + }); + + for (const key of state.players.keys()) { + if (!existingPlayers.has(key)) { + state.players.delete(key); + } + } + }, + + [MutationTypes.SET_CURRENT_MAP](state: State, {world, map}) { + const mapName = [world, map].join('_'); + + if(!state.worlds.has(world)) { + throw new RangeError(`Unknown world ${world}`); + } + + if(!state.maps.has(mapName)) { + throw new RangeError(`Unknown map ${map}`); + } + + state.currentWorld = state.worlds.get(world); + state.currentMap = state.maps.get(mapName); + }, +} + +type AugmentedActionContext = { + commit( + key: K, + payload: Parameters[1] + ):ReturnType; +} & Omit, "commit"> + +export interface Actions { + [ActionTypes.LOAD_CONFIGRUATION]( + {commit}: AugmentedActionContext, + ):Promise + [ActionTypes.GET_UPDATE]( + {commit}: AugmentedActionContext, + ):Promise +} + +export const actions: ActionTree & Actions = { + [ActionTypes.LOAD_CONFIGRUATION]({commit}) { + return API.getConfiguration().then(config => { + commit(MutationTypes.SET_CONFIGURATION, config.config); + commit(MutationTypes.SET_MESSAGES, config.messages); + commit(MutationTypes.SET_WORLDS, config.worlds); + + if(config.config.defaultWorld && config.config.defaultMap) { + commit(MutationTypes.SET_CURRENT_MAP, { + world: config.config.defaultWorld, + map: config.config.defaultMap + }); + } + + return config; + }); + }, + [ActionTypes.GET_UPDATE]({commit}) { + if(!state.currentWorld) { + return Promise.reject("No current world"); + } + + return API.getUpdate(state.updateRequestId, state.currentWorld.name, state.updateTimestamp.getUTCMilliseconds()).then(update => { + commit(MutationTypes.SET_PLAYERS, update.players); + commit(MutationTypes.SET_TIME_OF_DAY, update.timeOfDay); + commit(MutationTypes.SET_RAINING, update.raining); + commit(MutationTypes.SET_THUNDERING, update.thundering); + commit(MutationTypes.SET_UPDATE_TIMESTAMP, new Date(update.timestamp)); + commit(MutationTypes.INCREMENT_REQUEST_ID, undefined); + + return update; + }); + } +} + +export type State = { + configuration: DynmapServerConfig; + messages: DynmapMessageConfig; + worlds: Map; + maps: Map; + players: Map; + + following?: DynmapPlayer; + + // currentServer?: string; + currentWorld?: DynmapWorld; + currentMap?: DynmapMap; + + raining: boolean; + thundering: boolean; + timeOfDay: number; + + updateRequestId: number; + updateTimestamp: Date; +} + +export type Getters = { + +} + +export const getters: GetterTree & Getters = { + +} + +export type Store = Omit< + VuexStore, + "commit" | "getters" | "dispatch" + > & { + commit[1]>( + key: K, + payload: P, + options?: CommitOptions, + ):ReturnType; +} & { + getters: { + [K in keyof Getters]: ReturnType + }; +} & { + dispatch( + key: K, + payload: Parameters[1], + options?: DispatchOptions + ):ReturnType; +}; + +const state: State = { + configuration: { + version: '', + allowChat: false, + chatRequiresLogin: false, + chatInterval: 5000, + defaultMap: '', + defaultWorld: '', + defaultZoom: 0, + followMap: '', + followZoom: 0, + updateInterval: 3000, + showLayerControl: true, + title: '', + loginEnabled: false, + loginRequired: false, + maxPlayers: 0, + hash: 0, + }, + messages: { + chatNotAllowed: '', + chatRequiresLogin: '', + chatCooldown: '', + mapTypes: '', + players: '', + playerJoin: '', + playerQuit: '', + anonymousJoin: '', + anonymousQuit: '', + }, + worlds: new Map(), + maps: new Map(), + players: new Map(), + + raining: false, + thundering: false, + timeOfDay: 0, + + following: undefined, + + // currentServer: undefined, + currentWorld: undefined, + currentMap: undefined, + + updateRequestId: 0, + updateTimestamp: new Date(), +}; + +export const store = createStore({ + state, + mutations, + getters, + actions, + // plugins: [createLogger()], +}); + +// define your own `useStore` composition function +export function useStore() { + return store as Store; +} diff --git a/src/vuex.d.ts b/src/vuex.d.ts new file mode 100644 index 0000000..8927d01 --- /dev/null +++ b/src/vuex.d.ts @@ -0,0 +1,9 @@ +import { ComponentCustomProperties } from 'vue' +import {State, Store} from "@/store"; + +declare module '@vue/runtime-core' { + // provide typings for `this.$store` + interface ComponentCustomProperties { + $store: Store + } +} \ No newline at end of file