├── .all-contributorsrc ├── .editorconfig ├── .eslintrc.json ├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── support_question.md ├── .gitignore ├── .jsdoc2md.json ├── .versionrc ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── config.example.json ├── dist ├── 2b3e1faf89f94a483539.png ├── 416d91365b44e4b4f477.png ├── 8f2c4d11474275fbc161.png ├── app.ebf5ee37024ab61be51d.js ├── app.ebf5ee37024ab61be51d.js.map ├── index.html ├── runtime.ebf5ee37024ab61be51d.js ├── runtime.ebf5ee37024ab61be51d.js.map ├── style.ebf5ee37024ab61be51d.js ├── style.ebf5ee37024ab61be51d.js.map ├── vendors.ebf5ee37024ab61be51d.js ├── vendors.ebf5ee37024ab61be51d.js.LICENSE.txt └── vendors.ebf5ee37024ab61be51d.js.map ├── docs ├── CHANGELOG.md ├── FAQ.md ├── LICENSE.md ├── README.md ├── config.md ├── contributing.md ├── custom_maps.md ├── developers.md ├── images │ ├── 0c19843d5026e94c83623b294406d2cf6de64f072cd15f6f9afe65b2ffcd5db8.gif │ ├── 0e2595e1746eddc1e694a32653fa0ddd1d0eadde33cdc3e22be5e708f059f898.png │ ├── 1b74c6a78fda6509d07d328ce58d890f1b955122b68b6f05080b6532e97ffe7f.png │ ├── 4f9f772cf2c04f1ada6be1d56dccb56155d6607cb0dc7bf2e526a6f43bf7128b.png │ ├── 583c0e9ed7c51aad2d394775cdee98ed83b3637eb92bca89af8d14422ec84db4.png │ ├── 5a53cff3a68dd004f524716274d12f7791a7de7cdcd40e49de60b7e50ccd4569.png │ ├── 697acd53e4f8099573cdaf9ca7f142e4cff57f35c3cba6b67fc4876420172e06.png │ ├── 7ae7ff5a3642b4fc38b60e8696cc6bd96592726e608780d763afce9043a0aa8e.png │ ├── LiveMap logo.svg │ ├── a7369dd2c6a1d9e31db91cf8822373ad89d310aea6953f85cf952d02c2bcff9f.png │ ├── b47eab9039fe5df729ee8caba868f4de61df991c55fc06c83cc083897d97b140.png │ ├── b4e0ced36d3ffcdd61f08fa3eb442c5a01d23699a330fd58207a95c3842a20de.png │ ├── be9ec7dfc81bd265a3a44d20a98133b05df9a14a8d644409e40528a7debce5b8.png │ ├── cbc7f7b8ac5ca1b0e7690d642a6229830fa36ee16683cd0f63f32e1bffd230d4.png │ └── dfd01895ddccb7f7dd9f5cd0e1d07b73c46ecb1823f1ae9f05750ceb08a2af3d.png └── reverse_proxy.md ├── images ├── icons │ ├── blips.png │ ├── blips_texturesheet.png │ ├── debug.png │ └── normal.png ├── layers-2x.png ├── layers.png ├── marker-icon-2x.png ├── marker-icon.png ├── marker-shadow.png ├── profile.png └── tiles │ ├── extract_png.py │ ├── normal │ ├── minimap_sea_0_0.png │ ├── minimap_sea_0_1.png │ ├── minimap_sea_1_0.png │ ├── minimap_sea_1_1.png │ ├── minimap_sea_2_0.png │ ├── minimap_sea_2_1.png │ └── stitched.png │ ├── postal │ ├── minimap_sea_0_0.png │ ├── minimap_sea_0_1.png │ ├── minimap_sea_1_0.png │ ├── minimap_sea_1_1.png │ ├── minimap_sea_2_0.png │ └── minimap_sea_2_1.png │ └── read_ytd.py ├── index.html ├── mkdocs.yml ├── package.json ├── public ├── dev │ ├── blips.json │ ├── config.json │ └── version.json └── index.html ├── src ├── js │ ├── _app.js │ ├── alerter.js │ ├── config.js │ ├── controls.js │ ├── init.js │ ├── map.js │ ├── markers.js │ ├── objects.js │ ├── socket.js │ ├── translator.js │ ├── utils.js │ └── version-check.js └── sass │ ├── _alerts.scss │ ├── _leaflet.scss │ ├── _markerCluster.scss │ ├── _ui.scss │ ├── _variables.scss │ └── main.scss ├── tools ├── api-doc-template.hbs ├── partials │ ├── header.hbs │ └── link.hbs └── standard-version-bump.js ├── translations ├── en.json ├── es.json ├── fr.json ├── manifest.json └── ru.json ├── version.json ├── webpack.config.js └── yarn.lock /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "projectName": "live_map-interface", 3 | "projectOwner": "TGRHavoc", 4 | "repoType": "github", 5 | "repoHost": "https://github.com", 6 | "files": [ 7 | "docs/README.md" 8 | ], 9 | "imageSize": 100, 10 | "commit": true, 11 | "commitConvention": "angular", 12 | "contributors": [ 13 | { 14 | "login": "TGRHavoc", 15 | "name": "Jordan Dalton", 16 | "avatar_url": "https://avatars.githubusercontent.com/u/1770893?v=4", 17 | "profile": "https://tgrhavoc.co.uk/", 18 | "contributions": [ 19 | "code", 20 | "doc", 21 | "design", 22 | "ideas" 23 | ] 24 | }, 25 | { 26 | "login": "TomGrobbe", 27 | "name": "Tom", 28 | "avatar_url": "https://avatars.githubusercontent.com/u/31419184?v=4", 29 | "profile": "https://tomgrobbe.nl/", 30 | "contributions": [ 31 | "bug", 32 | "code" 33 | ] 34 | }, 35 | { 36 | "login": "xlxAciDxlx", 37 | "name": "AciD", 38 | "avatar_url": "https://avatars.githubusercontent.com/u/7502881?v=4", 39 | "profile": "https://xlxacidxlx.com/", 40 | "contributions": [ 41 | "bug", 42 | "code" 43 | ] 44 | }, 45 | { 46 | "login": "jiynn", 47 | "name": "jiynn", 48 | "avatar_url": "https://avatars.githubusercontent.com/u/33206565?v=4", 49 | "profile": "https://github.com/jiynn", 50 | "contributions": [ 51 | "bug" 52 | ] 53 | }, 54 | { 55 | "login": "Local9", 56 | "name": "127.0.0.1", 57 | "avatar_url": "https://avatars.githubusercontent.com/u/6077794?v=4", 58 | "profile": "https://github.com/Local9", 59 | "contributions": [ 60 | "bug", 61 | "code" 62 | ] 63 | }, 64 | { 65 | "login": "davwheat", 66 | "name": "David Wheatley", 67 | "avatar_url": "https://avatars.githubusercontent.com/u/7406822?v=4", 68 | "profile": "https://github.com/davwheat", 69 | "contributions": [ 70 | "code", 71 | "bug" 72 | ] 73 | }, 74 | { 75 | "login": "DaveOkpare", 76 | "name": "David Okpare", 77 | "avatar_url": "https://avatars.githubusercontent.com/u/19241431?v=4", 78 | "profile": "https://github.com/DaveOkpare", 79 | "contributions": [ 80 | "doc" 81 | ] 82 | }, 83 | { 84 | "login": "matsn0w", 85 | "name": "matsn0w", 86 | "avatar_url": "https://avatars.githubusercontent.com/u/15019582?v=4", 87 | "profile": "https://github.com/matsn0w", 88 | "contributions": [ 89 | "code", 90 | "bug" 91 | ] 92 | }, 93 | { 94 | "login": "JasonO99", 95 | "name": "Jason Olsen", 96 | "avatar_url": "https://avatars.githubusercontent.com/u/2074263?v=4", 97 | "profile": "https://github.com/JasonO99", 98 | "contributions": [ 99 | "bug" 100 | ] 101 | }, 102 | { 103 | "login": "Aaron-Downham", 104 | "name": "Aaron-Downham", 105 | "avatar_url": "https://avatars.githubusercontent.com/u/32743520?v=4", 106 | "profile": "https://github.com/Aaron-Downham", 107 | "contributions": [ 108 | "bug" 109 | ] 110 | }, 111 | { 112 | "login": "Annihilator4423", 113 | "name": "Annihilator4423", 114 | "avatar_url": "https://avatars.githubusercontent.com/u/61148120?v=4", 115 | "profile": "https://github.com/Annihilator4423", 116 | "contributions": [ 117 | "doc" 118 | ] 119 | }, 120 | { 121 | "login": "Cu-chi", 122 | "name": "Cuchi'", 123 | "avatar_url": "https://avatars.githubusercontent.com/u/42467470?v=4", 124 | "profile": "https://github.com/Cu-chi", 125 | "contributions": [ 126 | "translation" 127 | ] 128 | } 129 | ], 130 | "contributorsPerLine": 5, 131 | "skipCi": true 132 | } 133 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true 5 | }, 6 | "extends": [ 7 | "eslint:recommended", 8 | "plugin:prettier/recommended" 9 | ], 10 | "plugins": [ 11 | "prettier" 12 | ], 13 | 14 | "parserOptions": { 15 | "ecmaVersion": 2021, 16 | "sourceType": "module" 17 | }, 18 | "rules": { 19 | "eqeqeq": "error", 20 | "no-console": 0, 21 | "prettier/prettier": "error", 22 | "indent": [ 23 | "error", 24 | 4 25 | ], 26 | "linebreak-style": [ 27 | "error", 28 | "unix" 29 | ], 30 | "quotes": [ 31 | "error", 32 | "double" 33 | ], 34 | "semi": [ 35 | "error", 36 | "always" 37 | ] 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ["https://www.paypal.com/donate?hosted_button_id=4PPJGZNAGWJHL"] 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F41B Bug Report" 3 | about: "If something isn't working as expected \U0001F914." 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Possible Solution** 38 | 39 | 40 | **Additional context/Screenshots** 41 | Add any other context about the problem here. If applicable, add screenshots to help explain. 42 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F680 Feature Request" 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/support_question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F917 Support Question" 3 | about: "If you have a question \U0001F4AC, please check out the discussions" 4 | title: '' 5 | labels: question 6 | assignees: '' 7 | 8 | --- 9 | 10 | --------------^ Click "Preview" for a nicer view! 11 | 12 | For usage and support questions, please check out the discussions page. Thanks! 😁. 13 | 14 | https://github.com/TGRHavoc/live_map-interface/discussions 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | images/map/ 3 | images/__map/ 4 | images/tiles/ 5 | 6 | generate-changes.bat 7 | .changelog.rc 8 | 9 | node_modules/ 10 | /config.json 11 | 12 | _site/ 13 | obj/ 14 | 15 | ## Browserified/Babel'd js file. This should only exist on a developer's machine so, might as well ignore it. 16 | dist/js/ 17 | yarn-error.log 18 | .env 19 | /blips.json 20 | 21 | coverage/ 22 | .cache/ 23 | /blips2.json 24 | -------------------------------------------------------------------------------- /.jsdoc2md.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "js/src/**" 4 | ], 5 | "template": "tools/api-doc-template.hbs", 6 | "partial": "tools/partials/**", 7 | "no-gfm": false 8 | } 9 | -------------------------------------------------------------------------------- /.versionrc: -------------------------------------------------------------------------------- 1 | { 2 | "header": "# Changelog\n", 3 | "infile": "docs/CHANGELOG.md", 4 | "releaseCommitMessageFormat": "chore(release): v{{currentTag}}", 5 | "scripts": { 6 | "prerelease": "yarn build", 7 | "precommit": "git add -A dist/ index.html" 8 | }, 9 | "bumpFiles": [ 10 | { 11 | "filename": "version.json", 12 | "updater": "tools/standard-version-bump.js" 13 | }, 14 | { 15 | "filename": "package.json", 16 | "type": "json" 17 | } 18 | ], 19 | "commitAll": true, 20 | "types": [ 21 | { 22 | "type": "translation", 23 | "section": "Translations", 24 | "hidden": false 25 | }, 26 | { 27 | "type": "chore", 28 | "hidden": false 29 | }, 30 | { 31 | "type": "docs", 32 | "section": "Documentation", 33 | "hidden": false 34 | }, 35 | { 36 | "type": "style", 37 | "hidden": false 38 | }, 39 | { 40 | "type": "refactor", 41 | "hidden": false 42 | }, 43 | { 44 | "type": "perf", 45 | "section": "Performance", 46 | "hidden": false 47 | }, 48 | { 49 | "type": "test", 50 | "section": "Tests", 51 | "hidden": false 52 | } 53 | ] 54 | } 55 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "syler.sass-indented", 4 | "dbaeumer.vscode-eslint", 5 | "sibiraj-s.vscode-scss-formatter", 6 | "wayou.vscode-todo-highlight" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Launch debug.html", 6 | "type": "firefox", 7 | "request": "launch", 8 | "reAttach": true, 9 | "url": "http://localhost/gtav/debug.html", 10 | "pathMappings": [ 11 | { 12 | "url": "http://localhost/gtav", 13 | "path": "${workspaceFolder}" 14 | } 15 | ] 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.ignorePaths": [ 3 | "**/package-lock.json", 4 | "**/node_modules/**", 5 | "**/vscode-extension/**", 6 | "**/.git/objects/**", 7 | ".vscode", 8 | ".vscode-insiders", 9 | "dist/**" 10 | ], 11 | "cSpell.words": [ 12 | "autoclose", 13 | "autotimeout", 14 | "esversion", 15 | "spiderfy", 16 | "sprintf", 17 | "vsprintf" 18 | ], 19 | "eslint.validate": [ 20 | "javascript", 21 | "javascriptreact", 22 | "json" 23 | ], 24 | "editor.codeActionsOnSave": { 25 | "source.fixAll.eslint": true, 26 | }, 27 | } 28 | -------------------------------------------------------------------------------- /config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "debug": false, 3 | "tileDirectory": "images/tiles", 4 | "iconDirectory": "images/icons", 5 | "showIdentifiers": false, 6 | "groupPlayers": true, // Wether the map should group players together into "clusters" or not. 7 | "defaults": { // If a server doesn't have the key-value set, it will fallback to these values 8 | "ip": "127.0.0.1", // Make sure this is the PUBLIC IP of the FIVEM server 9 | "socketPort": "30121" // Set to the port that you set in the "socket_port" convar (if different to the one in the config) 10 | }, 11 | "servers": { 12 | "Default server 1": {}, // The config values are above, no need to write them again 13 | "Only IP changed": { // Only the IP is different for this server. So, change it 14 | "ip": "192.168.1.2" 15 | }, 16 | "Everything is different": { 17 | "ip": "10.10.0.1", 18 | "socketPort": "60121" 19 | }, 20 | "Reverse Proxy Example": { 21 | "reverseProxy": { // If you have knowledge on how to set up a "reverse proxy" for your webserver and want to keep the map on a secure connection, set the values below. 22 | "socket": "wss://example.com", // The secure, proxied url for the socket connection 23 | "blips": "https://example.com/server1/blips.json" // The secure, proxied url for the blip file 24 | } 25 | } 26 | }, 27 | "maps": [ 28 | { 29 | "name": "Normal", 30 | "url": "{tileDirectory}/normal/minimap_sea_{y}_{x}.png", 31 | "minZoom": -2 // Set lower to zoom out more 32 | }, 33 | { 34 | "name": "Postal", 35 | "url": "{tileDirectory}/postal/minimap_sea_{y}_{x}.png", 36 | "minZoom": -5 // Since this is 3 times bigger, just remove 3 from the default minZoom 37 | } 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /dist/2b3e1faf89f94a483539.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TGRHavoc/live_map-interface/86678087abe4916bfe245bfd4f5b07e2245fe9d2/dist/2b3e1faf89f94a483539.png -------------------------------------------------------------------------------- /dist/416d91365b44e4b4f477.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TGRHavoc/live_map-interface/86678087abe4916bfe245bfd4f5b07e2245fe9d2/dist/416d91365b44e4b4f477.png -------------------------------------------------------------------------------- /dist/8f2c4d11474275fbc161.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TGRHavoc/live_map-interface/86678087abe4916bfe245bfd4f5b07e2245fe9d2/dist/8f2c4d11474275fbc161.png -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | Havoc's LiveMap
-------------------------------------------------------------------------------- /dist/runtime.ebf5ee37024ab61be51d.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";var e,r={},t={};function o(e){var n=t[e];if(void 0!==n)return n.exports;var i=t[e]={id:e,exports:{}};return r[e].call(i.exports,i,i.exports,o),i.exports}o.m=r,e=[],o.O=(r,t,n,i)=>{if(!t){var a=1/0;for(s=0;s=i)&&Object.keys(o.O).every((e=>o.O[e](t[c])))?t.splice(c--,1):(l=!1,i0&&e[s-1][2]>i;s--)e[s]=e[s-1];e[s]=[t,n,i]},o.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return o.d(r,{a:r}),r},o.d=(e,r)=>{for(var t in r)o.o(r,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var r=o.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");t.length&&(e=t[t.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})(),(()=>{o.b=document.baseURI||self.location.href;var e={666:0};o.O.j=r=>0===e[r];var r=(r,t)=>{var n,i,[a,l,c]=t,u=0;if(a.some((r=>0!==e[r]))){for(n in l)o.o(l,n)&&(o.m[n]=l[n]);if(c)var s=c(o)}for(r&&r(t);u {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t666: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk\"] = self[\"webpackChunk\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"names":["deferred","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","id","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","this","Function","e","window","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","value","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","Error","replace","p","b","baseURI","self","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","push"],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/vendors.ebf5ee37024ab61be51d.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /* @preserve 2 | * Leaflet 1.7.1, a JS library for interactive maps. http://leafletjs.com 3 | * (c) 2010-2019 Vladimir Agafonkin, (c) 2010-2011 CloudMade 4 | */ 5 | 6 | /*! 7 | * Bootstrap v5.1.3 (https://getbootstrap.com/) 8 | * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 9 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 10 | */ 11 | -------------------------------------------------------------------------------- /docs/FAQ.md: -------------------------------------------------------------------------------- 1 | # Frequently Asked Questions 2 | 3 | - [Server Not Connecting/Showing Up](#server-not-connectingshowing-up) 4 | - [Not Able to Communicate with the FiveM server](#not-able-to-communicate-with-the-fivem-server) 5 | - [Adding blips using a web request](#adding-blips-using-a-web-request) 6 | - [Error Getting Config, Cannot load map! Multiple Choices](#error-getting-config-cannot-load-map-multiple-choices) 7 | - [Localhost Not Working](#localhost-not-working) 8 | - [Unable to Display Livemap when using HTTPS](#unable-to-display-livemap-when-using-https) 9 | - [Error with Socket Connection](#error-with-socket-connection) 10 | - [Interface Not Connecting to Server](#interface-not-connecting-to-server) 11 | - [Blips Not Appearing](#blips-not-appearing) 12 | 13 | 14 | ## Server Not Connecting/Showing Up 15 | 16 | - If your website is using HTTPS then, you need to set up a reverse proxy for the blip URL and the socket port in order for it to work. 17 | If you don't know how to do this, just make the website use HTTP. 18 | - If the issue persists, make sure you have a "map" array in the config. See [config.example.json](https://github.com/TGRHavoc/live_map-interface/blob/master/config.example.json). 19 | 20 | Additionally, if you wanted to use your own images, you would need the YTD files then, you can get a developer to run the extract_png.py file located [here](https://github.com/TGRHavoc/live_map-interface/tree/master/images/tiles). 21 | 22 | ## Not Able to Communicate with the FiveM server 23 | 24 | - Make sure the resource is actually starting on the server. Usually, setting the debug to debug or something should give you enough information to see if it's starting. 25 | - If it is starting and listening, make sure it's allowed through the firewall. 26 | 27 | ## Adding blips using a web request 28 | 29 | No, but you can add then manually. You can either go to each place and and do the command in game or, edit the json file manually. 30 | 31 | ## Error Getting Config, Cannot load map! Multiple Choices 32 | 33 | Probably means that the user's cannot access /config.json on your webserver. 34 | Make sure you can access it by going to http://{{WEB_SERVER}}/config.json and making sure it shows your config file. 35 | 36 | ## Localhost Not Working 37 | 38 | You need to use the server's public IP in the config.json file for it to work for other users. 39 | 40 | ## Unable to Display Livemap when using HTTPS 41 | 42 | 1. It's not possible for the resource to make a secure connection to FiveM. Simply, uninstall the resource. 43 | 2. If you do, then lookup on Google for "set up reverse proxy in {{webserver}}". 44 | 3. Substitute with the webservers name. And to get the websocket running securely as well, just change the query to "set up websocket revserse proxy in {{webserver}}". 45 | 46 | ## Error with Socket Connection 47 | 48 | Most likely a network issue. Make sure you have correctly opened your ports for the websocket connection. 49 | 50 | ## Interface Not Connecting to Server 51 | 52 | Port forward (if needed), allow though firewall and set the config to use the FiveM server's public IP address. 53 | 54 | ## Blips Not Appearing 55 | 56 | This is most likely because you haven't done the /blips generate command in game (you need to be an admin). 57 | 58 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # LiveMap interface 2 | 3 | [![All Contributors](https://img.shields.io/badge/all_contributors-12-orange.svg?style=flat-square)](#contributors-) 4 | 5 | 6 | 7 |

8 | Logo 9 |

10 | 11 | This is the Web Interface for the FiveM addon [live_map](https://github.com/TGRHavoc/live_map). 12 | 13 | - [Prerequisites](#prerequisites) 14 | - [How to install](#how-to-install) 15 | - [Screenshots 🖼️](#screenshots-️) 16 | - [Frequently Asked Questions ❓](#frequently-asked-questions-) 17 | - [Adding custom maps 🗺️](#adding-custom-maps-️) 18 | - [Developers Information 🧑‍💻](#developers-information-) 19 | - [Contributors ✨](#contributors-) 20 | 21 | ## Prerequisites 22 | 23 | In order to have this working, it is advised that you already have a webserver running and correctly configured. 24 | You will also need to install [live_map](https://github.com/TGRHavoc/live_map) on your FiveM server and have it configured. 25 | 26 | ## How to install 27 | 28 | Download the [latest version](https://github.com/TGRHavoc/live_map-interface/archive/master.zip). 29 | 30 | This should be enough to get the interface up and running on your website. If you want to change stuff like the images, look in the [configuration](config.md) section. 31 | 32 | ## Screenshots 🖼️ 33 | 34 | | ![Main Interface](./images/4f9f772cf2c04f1ada6be1d56dccb56155d6607cb0dc7bf2e526a6f43bf7128b.png) | ![Control Modal](./images/b4e0ced36d3ffcdd61f08fa3eb442c5a01d23699a330fd58207a95c3842a20de.png) | 35 | | :----------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------: | 36 | | Main Interface (Desktop) | Control Modal (Desktop) | 37 | 38 | | ![Blip control modal](./images/0e2595e1746eddc1e694a32653fa0ddd1d0eadde33cdc3e22be5e708f059f898.png) | ![Select Language](./images/583c0e9ed7c51aad2d394775cdee98ed83b3637eb92bca89af8d14422ec84db4.png) | 39 | | :--------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------: | 40 | | Blip control modal (Desktop) | Language Select (Desktop) | 41 | 42 | 43 | | ![Main Interface - Mobile](./images/1b74c6a78fda6509d07d328ce58d890f1b955122b68b6f05080b6532e97ffe7f.png) | ![Control Modal - Mobile](./images/cbc7f7b8ac5ca1b0e7690d642a6229830fa36ee16683cd0f63f32e1bffd230d4.png) | 44 | | :-------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------: | 45 | | Main Interface (Mobile) | Control Modal (Mobile) | 46 | 47 | | ![Blip control modal - Mobile](./images/cbc7f7b8ac5ca1b0e7690d642a6229830fa36ee16683cd0f63f32e1bffd230d4.png) | ![Select language - Mobile](./images/7ae7ff5a3642b4fc38b60e8696cc6bd96592726e608780d763afce9043a0aa8e.png) | 48 | | :-----------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------: | 49 | | Blip control modal (Mobile) | Language Select (Mobile) | 50 | 51 | | ![Player Information](./images/a7369dd2c6a1d9e31db91cf8822373ad89d310aea6953f85cf952d02c2bcff9f.png) | 52 | | :--------------------------------------------------------------------------------------------------: | 53 | | Player information (example) | 54 | 55 | | ![GIF of interface](./images/0c19843d5026e94c83623b294406d2cf6de64f072cd15f6f9afe65b2ffcd5db8.gif) | 56 | | :------------------------------------------------------------------------------------------------: | 57 | | GIF of the interface | 58 | 59 | ## Frequently Asked Questions ❓ 60 | 61 | If you run into any issues, consult the [F.A.Q.](FAQ.md) first. Amongst other things, this document contains information about common issues involving: 62 | - server not connecting/showing up 63 | - unable to communicate with FiveM server 64 | - errors getting blips 65 | - issues with localhost 66 | 67 | ## Adding custom maps 🗺️ 68 | Information on how to add custom maps from GTA or alternative into livemap. See [Custom Maps](custom_maps.md). 69 | 70 | ## Developers Information 🧑‍💻 71 | 72 | Useful information for developers on dependencies and files locations for development. See [Developers Information](developers.md). 73 | 74 | ## Contributors ✨ 75 | 76 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 |

Jordan Dalton

💻 📖 🎨 🤔

Tom

🐛 💻

AciD

🐛 💻

jiynn

🐛

127.0.0.1

🐛 💻

David Wheatley

💻 🐛

David Okpare

📖

matsn0w

💻 🐛

Jason Olsen

🐛

Aaron-Downham

🐛

Annihilator4423

📖

Cuchi'

🌍
101 | 102 | 103 | 104 | 105 | 106 | 107 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. 108 | Contributions of any kind welcome! 109 | 110 | If you would like to contribute, then check out the [contributing guide](contributing.md). 111 | -------------------------------------------------------------------------------- /docs/config.md: -------------------------------------------------------------------------------- 1 | # Configuration 2 | 3 | - [config.json](#configjson) 4 | - [defaults object](#defaults-object) 5 | - [reverse proxy object](#reverse-proxy-object) 6 | - [server object](#server-object) 7 | - [map object](#map-object) 8 | - [config.html](#confightml) 9 | 10 | ## config.json 11 | The only file you will need to change to configure the map is the `config.json` file. 12 | This file can have comments in it without breaking the interface. 13 | Below is a table with the different things you can put into your `config.json` file. 14 | 15 | | Name | Type | Example | What it does | 16 | | :-------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------: | 17 | | debug | boolean | false | This just enables/disables debug mode. | 18 | | tileDirectory | string | "images/tiles" | This is the directory that the interface should look in to find the tiled images. Note: This is used in the `maps` array | 19 | | iconDirectory | string | "images/icons" | This is where the interface can find the icon images | 20 | | showIdentifiers | boolean | false | This determines whether the interface shows a player's identifier or not. Note: This may be an IP (if server has it enabled). | 21 | | defaults | [default object](#defaults-object) | `"defaults": { "ip": "tgrhavoc.me", "socketPort": "30121"}` | This is the default the interface should fall back to use if a server doesn't have the value set. | 22 | | servers | [server object](#server-object) | `"A server": {"ip": "example.com"}` | This is the object that contains the server data for the interface. | 23 | | maps | array of [map objects](#map-object) | `"maps": [{"name": "Normal", "url": "{tileDirectory}/normal/minimap_sea_{y}_{x}.png"}]` | An array containing the different map tiles available to use on the interface. | 24 | 25 | #### defaults object 26 | 27 | | Name | Type | Example | What it does | 28 | | :----------- | --------------------------------------------- | --------------------------------------------- | :------------------------------------------------------------------------------------: | 29 | | ip | string | "example.com" | The **public** IP for your FiveM server. | 30 | | socketPort | number | 30121 | The port your LiveMap resource is listening on. | 31 | | reverseProxy | [reserse proxy object](#reverse-proxy-object) | `{"blips": "https://example.com/blips.json"}` | If you have a reverse proxy set up for the blips and socket connection, then use this. | 32 | 33 | 34 | ### reverse proxy object 35 | 36 | | Name | Type | Example | What it does | 37 | | :----- | ------ | ---------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------: | 38 | | socket | string | "wss://echo.example.com" | The URL to the reverse proxy for the websocket connection. If you're using NGINX, the [following should be useful](https://www.nginx.com/blog/websocket-nginx/). | 39 | | blips | string | "https://example.com/server1/blips.json" | The URL to the reverse proxy for the blips file (can even just be a static JSON file on a webserver). | 40 | 41 | ### server object 42 | 43 | The server objects must have a key whoes value is the server's name. 44 | For example, if you have a server called `This is my cool server` then, the server entry would look like. 45 | ```json 46 | "servers" : { 47 | "This is my cool server" : { 48 | "ip": "example.com" 49 | } 50 | } 51 | ``` 52 | 53 | **If you don't set something in this object, the interface will look at the "defaults" object and use it's values instead.** 54 | It's therefore best practice to only use the `revserProxy` property in the server's object itself. 55 | 56 | | Name | Type | Example | What it does | 57 | | :----------- | --------------------------------------------- | --------------------------------------------- | :------------------------------------------------------------------------------------: | 58 | | ip | string | "example.com" | The **public** IP for your FiveM server. | 59 | | socketPort | number | 30121 | The port your LiveMap resource is listening on. | 60 | | reverseProxy | [reserse proxy object](#reverse-proxy-object) | `{"blips": "https://example.com/blips.json"}` | If you have a reverse proxy set up for the blips and socket connection, then use this. | 61 | 62 | 63 | ### map object 64 | 65 | | Name | Type | Example | What it does | 66 | | :------ | ------ | ------------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------: | 67 | | name | string | "Postal" | The name of this tileset. This is used when the user wants to change the map | 68 | | url | string | "{tileDirectory}/postal/minimap_sea_{y}_{x}.png" | Where the images are located for this map. GTA's minimap files have the Y coordinate before the X coordinate hence the `{y}_{x}` in the string. | 69 | | minZoom | number | -3 | How many times can the user zoom out for this tile set. The lower the number, the more they can zoom out. | 70 | 71 | ## config.html 72 | 73 | 74 | 75 | If you're more of a visual person and, don't want to write a bunch of JSON to set up your server, you can use the utility page `config.html`. 76 | To get to this, just navigate to `utils/config.html` in your browser. 77 | This will give you a basic interface which, you can use to quickly configure the interface. 78 | 79 | !!! note 80 | 81 | You cannot add maps via this page. You will need to do this manually. -------------------------------------------------------------------------------- /docs/contributing.md: -------------------------------------------------------------------------------- 1 | # Contributing to LiveMap Interface 2 | 3 | First off, thanks for taking the time to contribute! ❤️ 4 | 5 | All types of contributions are encouraged and valued. See the Table of Contents for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉 6 | 7 | !!! note "" 8 | And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about: 9 | 10 | - Star the project 11 | - Tweet about it 12 | 13 | - [I Have a Question](#i-have-a-question) 14 | - [I Want To Contribute](#i-want-to-contribute) 15 | - [Reporting Bugs](#reporting-bugs) 16 | - [Suggesting Enhancements](#suggesting-enhancements) 17 | - [Your First Code Contribution](#your-first-code-contribution) 18 | - [Commit Messages](#commit-messages) 19 | - [Commit Message Header](#commit-message-header) 20 | - [Type](#type) 21 | - [Scope](#scope) 22 | - [Summary](#summary) 23 | - [Commit Message Body](#commit-message-body) 24 | - [Commit Message Footer](#commit-message-footer) 25 | - [Revert commits](#revert-commits) 26 | 27 | 28 | ## I Have a Question 29 | 30 | > If you want to ask a question, we assume that you have read the available [Documentation](https://docs.tgrhavoc.co.uk/livemap-interface/). 31 | 32 | Before you ask a question, it is best to search for existing [Issues](https://github.com/TGRHavoc/live_map-interface/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first. 33 | 34 | If you then still feel the need to ask a question and need clarification, we recommend the following: 35 | 36 | - Start a [Issue](https://github.com/TGRHavoc/live_map-interface/issues/new?labels=question). 37 | - Provide as much context as you can about what you're running into. 38 | - Provide project and platform versions (nodejs, npm, etc), depending on what seems relevant. 39 | 40 | We will then take care of the issue as soon as possible. 41 | 42 | ## I Want To Contribute 43 | 44 | > ### Legal Notice 45 | > When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license. 46 | 47 | ### Reporting Bugs 48 | 49 | #### Before Submitting a Bug Report 50 | 51 | A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible. 52 | 53 | - Make sure that you are using the latest version. 54 | - Determine if your bug is really a bug and not an error on your side e.g. incorrectly configured (Make sure that you have read the [documentation](https://docs.tgrhavoc.co.uk/livemap-interface/). If you are looking for support, you might want to check [this section](#i-have-a-question)). 55 | - To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/TGRHavoc/live_map-interface/issues?q=label%3Abug). 56 | - Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue. 57 | - Collect information about the bug: 58 | - Console Errors (Shift + CTRL + J) 59 | - Browser (including version) and OS (Windows, Linux, macOS, x86, ARM) 60 | - Possibly your input and the output or what you did to get the issue 61 | - Can you reliably reproduce the issue? And can you also reproduce it with older versions? 62 | 63 | #### How Do I Submit a Good Bug Report? 64 | 65 | > You must never report security related issues, vulnerabilities or bugs to the issue tracker, or elsewhere in public. Instead please use the [Security Advisories](https://github.com/TGRHavoc/live_map-interface/security/advisories) feature of Github. 66 | 67 | 68 | 69 | We use GitHub issues to track bugs and errors. If you run into an issue with the project: 70 | 71 | - Open an [Issue](https://github.com/TGRHavoc/live_map-interface/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.) 72 | - Explain the behavior you would expect and the actual behavior. 73 | - Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case. 74 | - Provide the information you collected in the previous section. 75 | 76 | Once it's filed: 77 | 78 | - The project team will label the issue accordingly. 79 | - A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced. 80 | - If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be [implemented by someone](#your-first-code-contribution). 81 | 82 | There will be templates you can follow whilst filling out issues. 83 | Please fill these out to the best of your ability when submitting an issue as it will allow the issue to be dealt with smoother and quicker than without. 84 | 85 | ### Suggesting Enhancements 86 | 87 | This section guides you through submitting an enhancement suggestion for LiveMap Interface, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions. 88 | 89 | #### Before Submitting an Enhancement 90 | 91 | - Make sure that you are using the latest version. 92 | - Read the [documentation](https://docs.tgrhavoc.co.uk/livemap-interface/) carefully and find out if the functionality is already covered, maybe by an individual configuration. 93 | - Perform a [search](https://github.com/TGRHavoc/live_map-interface/issues) to see if the [enhancement](https://github.com/TGRHavoc/live_map-interface/labels/enhancement) or [feature request](https://github.com/TGRHavoc/live_map-interface/labels/feature-request) has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. 94 | - Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library. 95 | 96 | #### How Do I Submit a Good Enhancement Suggestion? 97 | 98 | Enhancement suggestions are tracked as [GitHub issues](https://github.com/TGRHavoc/live_map-interface/labels/enhancement). 99 | 100 | - Use a **clear and descriptive title** for the issue to identify the suggestion. 101 | - Provide a **step-by-step description of the suggested enhancement** in as much detail as possible. 102 | - **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you. 103 | - You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. 104 | - **Explain why this enhancement would be useful** to most LiveMap Interface users. You may also want to point out the other projects that solved it better and which could serve as inspiration. 105 | 106 | ### Your First Code Contribution 107 | In order to get started with contributing code to LiveMap Interface, you will need to have a text editor or an Integrated Development Environment (IDE). 108 | The most popular text editors that you might want to use include (but is not limited to) [VisualStudio Code](https://code.visualstudio.com/), [Atom](https://atom.io/), [Sublime Text](https://www.sublimetext.com/) or [Notepad++](https://notepad-plus-plus.org/downloads/). 109 | 110 | After you have your editor/IDE set up to your liking and you're ready to get coding, head over to the [developers](developers.md) file for more information. 111 | 112 | ## Commit Messages 113 | 114 | This project utilises the [Conventional Commits Guidelines](https://www.conventionalcommits.org/en/v1.0.0/). 115 | All commits should follow this convention as it leads to **more readable messages** that are easy to follow when looking through the **project history**. 116 | 117 | Each commit message consists of a **header**, a **body**, and a **footer**. 118 | 119 | ``` 120 |
121 | 122 | 123 | 124 |