├── .github ├── weblate_pull_request_template.md └── workflows │ ├── pages.yml │ └── weblate-pull-request.yml ├── .gitignore ├── .vscode └── extensions.json ├── FUNDING.yml ├── LICENSE.txt ├── README.md ├── docs └── header.png ├── index.html ├── locales ├── de.json ├── en.json ├── fr.json ├── ja.json ├── pt.json ├── ru.json ├── th.json ├── tr.json ├── vi.json └── zh_CN.json ├── package-lock.json ├── package.json ├── public ├── CNAME ├── apple-touch-icon.png ├── favicon-192x192.png ├── favicon-512x512.png ├── favicon-maskable.svg ├── favicon-monochrome.svg ├── favicon.svg ├── icon.png ├── images │ ├── modrinth.svg │ ├── spawn_icon.png │ └── wave.png ├── robots.txt └── shadow.png ├── scripts ├── createVanillaZips.py └── requirements.txt ├── src ├── App.vue ├── BuildIn │ ├── MultiNoiseBiomeParameterList.ts │ └── VanillaItems.ts ├── MapLayers │ ├── BiomeLayer.ts │ └── Graticule.ts ├── assets │ └── kofi.svg ├── components │ ├── BiomeTooltip.vue │ ├── Collapsable.vue │ ├── DatapackEntry.vue │ ├── DatapackList.vue │ ├── Faq.vue │ ├── Footer.vue │ ├── LocaleChanger.vue │ ├── MainMap.vue │ ├── MapButton.vue │ ├── MenuButtons.vue │ ├── MinecraftText.vue │ ├── Popup.vue │ ├── SettingsPanel.vue │ ├── Sidebar.vue │ ├── TipMessage.vue │ ├── YSlider.vue │ ├── dropdown │ │ ├── Dropdown.vue │ │ ├── DropdownEntry.vue │ │ ├── DropdownIconEntry.vue │ │ ├── DropdownRecentsEntry.vue │ │ ├── FindBiomeDropdown.vue │ │ ├── ListDropdown.vue │ │ ├── ListDropdownEntry.vue │ │ ├── ListDropdownGroup.vue │ │ ├── OpenDropdown.vue │ │ └── StructureDropdown.vue │ └── modrinth │ │ ├── ModrinthEntry.vue │ │ └── ModrinthMenu.vue ├── main.ts ├── stores │ ├── useBiomeSearchStore.ts │ ├── useDatapackStore.ts │ ├── useLoadedDimensionStore.ts │ ├── useRecentStore.ts │ ├── useSettingsStore.ts │ └── useUiStore.ts ├── style.css ├── util.ts ├── util │ ├── CachedBiomeSource.ts │ ├── EventTracker.ts │ ├── SpawnTarget.ts │ ├── TextComponent.ts │ └── base64ArrayBuffer.ts ├── vite-env.d.ts └── webworker │ └── MultiNoiseCalculator.ts ├── tsconfig.json ├── tsconfig.node.json ├── vanilla_datapack_base ├── data │ ├── c │ │ └── worldgen │ │ │ ├── biome_colors.json │ │ │ └── structure_icons.json │ ├── jacobsjo │ │ └── tags │ │ │ └── worldgen │ │ │ └── structure │ │ │ └── hidden_from_map.json │ └── minecraft │ │ └── worldgen │ │ └── density_function │ │ ├── overworld │ │ └── snowcapped_surface.json │ │ ├── overworld_amplified │ │ └── snowcapped_surface.json │ │ └── overworld_large_biomes │ │ └── snowcapped_surface.json └── pack.png └── vite.config.ts /.github/weblate_pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | Updated translations from `weblate` 3 | 4 | ## Updated Files 5 | 6 | -------------------------------------------------------------------------------- /.github/workflows/pages.yml: -------------------------------------------------------------------------------- 1 | # Simple workflow for deploying static content to GitHub Pages 2 | name: Deploy site to GitHub Pages 3 | 4 | on: 5 | # Runs on pushes targeting the default branch 6 | push: 7 | branches: ["main"] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 13 | permissions: 14 | contents: read 15 | pages: write 16 | id-token: write 17 | 18 | # Allow one concurrent deployment 19 | concurrency: 20 | group: "pages" 21 | cancel-in-progress: true 22 | 23 | jobs: 24 | deploy: 25 | environment: 26 | name: github-pages 27 | url: ${{ steps.deployment.outputs.page_url }} 28 | runs-on: ubuntu-latest 29 | steps: 30 | - name: Checkout 31 | uses: actions/checkout@v3 32 | - name: Set up Python 33 | uses: actions/setup-python@v4 34 | with: 35 | python-version: '3.10' 36 | - name: Install Python dependencies 37 | run: pip install -r scripts/requirements.txt 38 | - name: Set up Node 39 | uses: actions/setup-node@v3 40 | with: 41 | node-version: 18 42 | cache: 'npm' 43 | - name: Install Node dependencies 44 | run: npm install 45 | - name: Create vanilla datapack zip files 46 | run: npm run createZips 47 | - name: Collect Dependencies 48 | run: yarn licenses generate-disclaimer > public/OTHER_LICENSES.txt 49 | - name: Build 50 | run: npm run build 51 | - name: Setup Pages 52 | uses: actions/configure-pages@v3 53 | - name: Upload artifact 54 | uses: actions/upload-pages-artifact@v3 55 | with: 56 | # Upload dist repository 57 | path: './dist' 58 | - name: Deploy to GitHub Pages 59 | id: deployment 60 | uses: actions/deploy-pages@v4 61 | -------------------------------------------------------------------------------- /.github/workflows/weblate-pull-request.yml: -------------------------------------------------------------------------------- 1 | name: Create Pull Request for Weblate Translations 2 | 3 | on: 4 | push: 5 | branches: ["weblate"] 6 | 7 | workflow_dispatch: 8 | 9 | # Allow one concurrent deployment 10 | concurrency: 11 | group: "weblate" 12 | cancel-in-progress: true 13 | 14 | jobs: 15 | deploy: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@v3 20 | with: 21 | fetch-depth: 0 22 | - name: Create Pull Request 23 | uses: devops-infra/action-pull-request@v0.5.5 24 | with: 25 | github_token: ${{ secrets.GITHUB_TOKEN }} 26 | source_branch: weblate 27 | target_branch: main 28 | title: Updated Translations from Weblate 29 | template: .github/weblate_pull_request_template.md 30 | label: weblate 31 | get_diff: true 32 | allow_no_diff: false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | public/vanilla_datapacks/ 2 | public/OTHER_LICENSES.txt 3 | 4 | # Logs 5 | logs 6 | *.log 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | pnpm-debug.log* 11 | lerna-debug.log* 12 | 13 | node_modules 14 | dist 15 | dist-ssr 16 | *.local 17 | *.cpuprofile 18 | 19 | # Editor directories and files 20 | .vscode/* 21 | !.vscode/extensions.json 22 | .idea 23 | .DS_Store 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [jacobsjo] -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright 2021 Jochen Jacobs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![](https://img.shields.io/github/actions/workflow/status/jacobsjo/mc-datapack-map/pages.yml)](https://github.com/jacobsjo/mc-datapack-map/actions) 2 | [![map.jacobsjo.eu](https://img.shields.io/github/deployments/jacobsjo/mc-datapack-map/github-pages?label=map.jacobsjo.eu)](https://map.jacobsjo.eu) 3 | [![](https://img.shields.io/github/issues-raw/jacobsjo/mc-datapack-map)](https://github.com/jacobsjo/mc-datapack-map/issues) 4 | [![](https://img.shields.io/badge/sponsor-jacobsjo-blue)](https://github.com/sponsors/jacobsjo) 5 | [![](https://weblate.catter.dev/widget/jacobsjo/mc-datapack-map/svg-badge.svg)](https://weblate.catter.dev/projects/jacobsjo/mc-datapack-map/) 6 | 7 | 8 | ## Use online at https://map.jacobsjo.eu 9 | 10 | -------- 11 | 12 | # MC Datapack Map 13 | 14 | | | | 15 | |---|---| 16 | | [![](public/favicon.svg)](https://map.jacobsjo.eu) | A Leaflet based map to display Minecraft biome layouts and structures of vanilla and using worldgen datapacks. | 17 | | | | 18 | 19 | ![](docs/header.png) 20 | 21 | # Translations 22 | Translate at https://weblate.catter.dev/projects/jacobsjo/mc-datapack-map/ 23 | 24 | # Contributing 25 | Contributions are welcome! For significant feature additions please ask beforehand by opening an issue or on discord. 26 | 27 | ## Setup dev environment: 28 | 29 | 1. Install python dependencies: `pip install -r requirements.txt` 30 | 2. Install node dependencies: `npm i` 31 | 3. Create vanilla datapack zip files: `npm run createZips` 32 | 4. Start dev server: `npm run dev` and open http://localhost:5173/ 33 | - **dev environment requires a [browser supporting ECMAScript modules in webworkers](https://caniuse.com/mdn-api_worker_worker_ecmascript_modules)** 34 | 35 | 5. Build final page: `npm run build` 36 | 6. Test build version: `npm run preview` and open https://localhost:4173/ -------------------------------------------------------------------------------- /docs/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobsjo/mc-datapack-map/86d8f729324912092b64778907ad0c32f440e961/docs/header.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Minecraft Datapack Map 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /locales/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "locale.local_name": "Deutsch", 3 | "locale.minecraft_locale": "de_de", 4 | "locale.change_locale.title": "Sprache ändern", 5 | "settings.mc_version.label": "Version:", 6 | "settings.mc_version.aria-label": "Minecraft-Version", 7 | "settings.mc_version.mc1_19": "Minecraft 1.19.x", 8 | "settings.mc_version.mc1_20": "Minecraft 1.20 / 1.20.1", 9 | "settings.mc_version.mc1_20_2": "Minecraft 1.20.2", 10 | "settings.mc_version.mc1_20_4": "Minecraft 1.20.4", 11 | "settings.world_preset.label": "Weltvorlage:", 12 | "settings.world_preset.aria-label": "Weltvorlage", 13 | "settings.dimension.label": "Dimension:", 14 | "settings.dimension.aria-label": "Dimension", 15 | "settings.seed.label": "Startwert:", 16 | "settings.seed.aria-label": "Startwert", 17 | "settings.seed.randomize_button.title": "Zufälliger Startwert", 18 | "footer.legel.note": "KEIN OFFIZIELLES MINECRAFT WERKZEUG. NICHT GENEHMIGT VON ODER VERBUNDEN MIT MOJANG ODER MICROSOFT.", 19 | "footer.about": "Info", 20 | "footer.view_source": "Quellcode", 21 | "footer.report_issue": "Problem Melden", 22 | "footer.wiki": "Kompatibilitätsanleitung", 23 | "footer.other": "Werkzeuge", 24 | "footer.licenses": "Lizensen", 25 | "footer.sponsor": "Sponsor", 26 | "footer.more": "mehr…", 27 | "datapack_list.remove_datapack.title": "Paket entfernen", 28 | "menu.search_biome.title": "Biom suchen", 29 | "menu.structure_positions.title": "Strukturpositionen", 30 | "menu.reload_datapacks.title": "Pakete neu laden", 31 | "dropdown.add.zip": "Paket oder Mod öffnen", 32 | "dropdown.add.folder": "Ordner öffnen", 33 | "dropdown.add.built_in.update_1_20": "Update 1.20", 34 | "dropdown.add.built_in.title": "Mitgelieferte Datenpakete", 35 | "dropdown.add.recents.title": "Zuletzt genutzt", 36 | "dropdown.add.recents.not_found": "Paket nicht gefunden. Wird auf liste zuletzt genutzter Pakete entfernt.", 37 | "dropdown.add.recents.enable": "Aktivieren", 38 | "dropdown.add.recents.enable.note": "(Lokalen Speicher akzeptieren)", 39 | "dropdown.add.recents.empty": "Leer", 40 | "dropdown.add.recents.unavailable": "In diesem Browser nicht verfügbar", 41 | "dropdown.search_biome.placeholder": "Biom suchen", 42 | "dropdown.structure_positions.placeholder": "Struktur suchen", 43 | "toggle_sidebar.title": "Seitenleise umschalten", 44 | "map.info.structures_hidden": "Einige Strukturen werden nicht angezeigt. Heranzoomen um mehr zu sehen.", 45 | "map.info.teleport_command_copied": "Teleport-Befehl kopiert", 46 | "map.error.structures_unsupported": "Einige ausgewählte Strukturen werden nicht unterstützt! Sorry.", 47 | "map.yslider.aria-label": "Y Wert", 48 | "map.yslider.y-label": "Y: {y}", 49 | "map.setting.project": "Verschiebe Position nach unten zur Oberfläche", 50 | "map.setting.sealevel": "Zeige Meeresspiegel", 51 | "map.setting.hillshade": "Schattierung aktivieren", 52 | "footer.translate": "Übersetzen", 53 | "map.tooltip.spawn": "Einstiegspunkt", 54 | "minecraft.structure.minecraft.desert_pyramid": "Wüstentempel", 55 | "minecraft.structure.minecraft.swamp_hut": "Sumpfhütte", 56 | "dropdown.add.picker.pack_and_mod": "Pakete und Mods", 57 | "settings.dev_mode.label": "Entwicklermodus:", 58 | "settings.dev_mode.aria-label": "Entwicklermodus", 59 | "minecraft.dimension.minecraft.overworld": "Oberwelt", 60 | "minecraft.dimension.minecraft.the_end": "Das Ende", 61 | "minecraft.dimension.minecraft.the_nether": "Nether", 62 | "minecraft.structure.minecraft.ancient_city": "Antike Stätte", 63 | "minecraft.structure.minecraft.bastion_remnant": "Bastionsruine", 64 | "minecraft.structure.minecraft.buried_treasure": "Vergrabener Schatz", 65 | "minecraft.structure.minecraft.end_city": "Endsiedlung", 66 | "minecraft.structure.minecraft.fortress": "Netherfestung", 67 | "minecraft.structure.minecraft.igloo": "Iglu", 68 | "minecraft.structure.minecraft.jungle_pyramid": "Dschungeltempel", 69 | "minecraft.structure.minecraft.mansion": "Waldanwesen", 70 | "minecraft.structure.minecraft.ocean_ruin_cold": "Kalte Ozeanruine", 71 | "minecraft.structure.minecraft.ocean_ruin_warm": "Warme Ozeanruine", 72 | "minecraft.structure.minecraft.pillager_outpost": "Plünderer-Außenposten", 73 | "minecraft.structure.minecraft.shipwreck": "Schiffswrack", 74 | "minecraft.structure.minecraft.shipwreck_beached": "Gestrandetes Schiffswrack", 75 | "minecraft.structure.minecraft.stronghold": "Festung", 76 | "minecraft.structure.minecraft.trail_ruins": "Pfadruine", 77 | "minecraft.structure.minecraft.village_desert": "Wüstendorf", 78 | "minecraft.structure.minecraft.village_plains": "Ebenendorf", 79 | "minecraft.structure.minecraft.village_savanna": "Savannendorf", 80 | "minecraft.structure.minecraft.village_snowy": "Verschneites Dorf", 81 | "minecraft.structure.minecraft.village_taiga": "Taigadorf", 82 | "menu.add.title": "Paket hinzufügen", 83 | "dropdown.add.picker.pack": "Pakete (*.zip)", 84 | "dropdown.add.picker.mod": "Mods (*.jar)", 85 | "minecraft.structure.minecraft.trial_chambers": "Prüfungskammern", 86 | "dropdown.add.built_in.update_1_21": "Update 1.21", 87 | "tip_message.message": "Wenn du diese Karte nützlich findest, würde ich mich über ein Trinkgeld freuen!", 88 | "tip_message.kofi": "Kauf mir nen Kaffee", 89 | "tip_message.github": "Sponsor", 90 | "tip_message.close": "Schließen", 91 | "settings.mc_version.mc1_20_6": "Minecraft 1.20.6", 92 | "map.setting.graticule": "Zeige das Regionsgitter", 93 | "settings.mc_version.mc1_21_1": "Minecraft 1.21.1", 94 | "settings.mc_version.mc1_21_3": "Minecraft 1.21.3", 95 | "modrinth.ignore-version": "Ignoriere die Minecraft Version", 96 | "modrinth.ignore-version.notice": "Datenpakte für andere Versionen könnten nicht so funktionieren wie gedacht", 97 | "modrinth.ignore-version.aria-label": "Ignoriere die Minecraft Version in der Suche", 98 | "settings.mc_version.mc1_21_4": "Minecraft 1.21.4", 99 | "dropdown.add.modrinth": "von Modrinth öffnen", 100 | "dropdown.add.recents.type.zip": "im Browser gespeicherte Zip-Datei", 101 | "dropdown.add.recents.type.folder": "Direkt von Festplatte geladenes Ordner-Datenpaket", 102 | "dropdown.add.recents.type.modrinth": "Neueste Version von Modrinth", 103 | "dropdown.add.recents.wrong_version": "Nicht in dieser Version verfügbar ", 104 | "modrinth.title": "von Modrinth öffnen", 105 | "modrinth.search.placeholder": "Modrinth durchsuchen...", 106 | "modrinth.include-mods": "auch Mods suchen", 107 | "modrinth.include-mods.aria-label": "Mods in suche mit einschließen", 108 | "modrinth.include-mods.notice": "Nicht alle Mods werden von dieser Karte unterstützt", 109 | "modrinth.search.aria-label": "Suchleiste für Datenpakete von Modrinth", 110 | "dropdown.add.built_in.winter_drop": "Winter Drop" 111 | } 112 | -------------------------------------------------------------------------------- /locales/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "locale.local_name": "English", 3 | "locale.minecraft_locale": "en_us", 4 | "locale.change_locale.title": "Change Language", 5 | "settings.mc_version.label": "Version:", 6 | "settings.mc_version.aria-label": "Minecraft Version", 7 | "settings.mc_version.mc1_19": "Minecraft 1.19.x", 8 | "settings.mc_version.mc1_20": "Minecraft 1.20 / 1.20.1", 9 | "settings.mc_version.mc1_20_2": "Minecraft 1.20.2", 10 | "settings.mc_version.mc1_20_4": "Minecraft 1.20.4", 11 | "settings.mc_version.mc1_20_6": "Minecraft 1.20.6", 12 | "settings.mc_version.mc1_21_1": "Minecraft 1.21.1", 13 | "settings.mc_version.mc1_21_3": "Minecraft 1.21.3", 14 | "settings.mc_version.mc1_21_4": "Minecraft 1.21.4", 15 | "settings.mc_version.mc1_21_5": "Minecraft 1.21.5", 16 | "settings.dev_mode.label": "Developer Mode:", 17 | "settings.dev_mode.aria-label": "Developer Mode", 18 | "settings.world_preset.label": "World Preset:", 19 | "settings.world_preset.aria-label": "World Preset", 20 | "settings.dimension.label": "Dimension:", 21 | "settings.dimension.aria-label": "Dimension", 22 | "settings.seed.label": "Seed:", 23 | "settings.seed.aria-label": "Seed", 24 | "settings.seed.randomize_button.title": "Randomize Seed", 25 | "minecraft.dimension.minecraft.overworld": "Overworld", 26 | "minecraft.dimension.minecraft.the_end": "The End", 27 | "minecraft.dimension.minecraft.the_nether": "The Nether", 28 | "minecraft.structure.minecraft.ancient_city": "Ancient City", 29 | "minecraft.structure.minecraft.bastion_remnant": "Bastion Remnant", 30 | "minecraft.structure.minecraft.buried_treasure": "Buried Treasure", 31 | "minecraft.structure.minecraft.desert_pyramid": "Desert Pyramid", 32 | "minecraft.structure.minecraft.end_city": "End City", 33 | "minecraft.structure.minecraft.fortress": "Nether Fortress", 34 | "minecraft.structure.minecraft.igloo": "Igloo", 35 | "minecraft.structure.minecraft.jungle_pyramid": "Jungle Temple", 36 | "minecraft.structure.minecraft.mansion": "Woodland Mansion", 37 | "minecraft.structure.minecraft.ocean_ruin_cold": "Cold Ocean Ruin", 38 | "minecraft.structure.minecraft.ocean_ruin_warm": "Warm Ocean Ruin", 39 | "minecraft.structure.minecraft.pillager_outpost": "Pillager Outpost", 40 | "minecraft.structure.minecraft.shipwreck": "Shipwreck", 41 | "minecraft.structure.minecraft.shipwreck_beached": "Beached Shipwreck", 42 | "minecraft.structure.minecraft.stronghold": "Stronghold", 43 | "minecraft.structure.minecraft.swamp_hut": "Swamp Hut", 44 | "minecraft.structure.minecraft.trail_ruins": "Trail Ruins", 45 | "minecraft.structure.minecraft.trial_chambers": "Trial Chambers", 46 | "minecraft.structure.minecraft.village_desert": "Desert Village", 47 | "minecraft.structure.minecraft.village_plains": "Plains Village", 48 | "minecraft.structure.minecraft.village_savanna": "Savanna Village", 49 | "minecraft.structure.minecraft.village_snowy": "Snowy Village", 50 | "minecraft.structure.minecraft.village_taiga": "Taiga Village", 51 | "footer.legel.note": "NOT AN OFFICIAL MINECRAFT TOOL. NOT APPROVED BY OR ASSOCIATED WITH MOJANG OR MICROSOFT.", 52 | "footer.about": "About", 53 | "footer.view_source": "View Source", 54 | "footer.report_issue": "Report Issue", 55 | "footer.wiki": "Compatability Guide", 56 | "footer.other": "Other Tools", 57 | "footer.licenses": "Licenses", 58 | "footer.translate": "Translate", 59 | "footer.sponsor": "Sponsor", 60 | "footer.more": "more…", 61 | "datapack_list.remove_datapack.title": "Remove pack", 62 | "menu.add.title": "Add Pack", 63 | "menu.search_biome.title": "Search Biome", 64 | "menu.search_biome.toggle": "Toggle Biome Filter", 65 | "menu.structure_positions.title": "Structure Positions", 66 | "menu.reload_datapacks.title": "Reload Packs", 67 | "dropdown.add.zip": "Open Pack or Mod", 68 | "dropdown.add.picker.pack_and_mod": "Packs and Mods", 69 | "dropdown.add.picker.pack": "Packs (*.zip)", 70 | "dropdown.add.picker.mod": "Mods (*.jar)", 71 | "dropdown.add.folder": "Open Folder", 72 | "dropdown.add.modrinth": "Open from Modrinth", 73 | "dropdown.add.built_in.update_1_20": "Update 1.20", 74 | "dropdown.add.built_in.update_1_21": "Update 1.21", 75 | "dropdown.add.built_in.winter_drop": "Winter Drop", 76 | "dropdown.add.built_in.title": "Built-in Datapacks", 77 | "dropdown.add.recents.title": "Recently used", 78 | "dropdown.add.recents.not_found": "Pack not Found. Removing from recently used list.", 79 | "dropdown.add.recents.enable": "Enable", 80 | "dropdown.add.recents.enable.note": "(accept local storage)", 81 | "dropdown.add.recents.empty": "Empty", 82 | "dropdown.add.recents.unavailable": "Unsupported in this browser", 83 | "dropdown.add.recents.type.zip": "zip file stored in browser", 84 | "dropdown.add.recents.type.folder": "folder datapack directly opened from disk", 85 | "dropdown.add.recents.type.modrinth": "newest version from modrinth", 86 | "dropdown.add.recents.wrong_version": "unavailable for this version ", 87 | "dropdown.search_biome.placeholder": "Search Biome", 88 | "dropdown.structure_positions.placeholder": "Search Structure", 89 | "modrinth.title": "Open from Modrinth", 90 | "modrinth.search.aria-label": "Searchbar for datapacks on Modrinth", 91 | "modrinth.search.placeholder": "Search Modrinth...", 92 | "modrinth.include-mods": "include mods", 93 | "modrinth.include-mods.aria-label": "include mods in search", 94 | "modrinth.include-mods.notice": "Not all mods are supported by this map", 95 | "modrinth.ignore-version": "ignore minecraft version", 96 | "modrinth.ignore-version.aria-label": "ignore minecraft version in search", 97 | "modrinth.ignore-version.notice": "Datapacks for other versions might not work as expected", 98 | "toggle_sidebar.title": "Toggle Sidebar", 99 | "map.info.structures_hidden": "Some structures are hidden. Zoom in to see more.", 100 | "map.info.teleport_command_copied": "Teleport Command Copied", 101 | "map.error.structures_unsupported": "Some selected structures are unsupported! Sorry.", 102 | "map.tooltip.spawn": "Spawn Point", 103 | "map.yslider.aria-label": "Y Level", 104 | "map.yslider.y-label": "Y: {y}", 105 | "map.setting.project": "Move location down to surface", 106 | "map.setting.sealevel": "Show sea level", 107 | "map.setting.hillshade": "Enable hillshading", 108 | "map.setting.graticule": "Show region grid", 109 | "tip_message.message": "If you find this map useful, I would appreciate a Tip!", 110 | "tip_message.kofi": "Buy Me a Coffee", 111 | "tip_message.github": "Sponsor", 112 | "tip_message.close": "Dismiss" 113 | } 114 | -------------------------------------------------------------------------------- /locales/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "locale.local_name": "Français", 3 | "locale.minecraft_locale": "fr_fr", 4 | "settings.mc_version.mc1_19": "Minecraft 1.19.x", 5 | "settings.mc_version.mc1_20": "Minecraft 1.20 / 1.20.1", 6 | "settings.mc_version.mc1_20_2": "Minecraft 1.20.2", 7 | "settings.mc_version.mc1_20_4": "Minecraft 1.20.4", 8 | "settings.seed.randomize_button.title": "Randomiser la graine", 9 | "minecraft.dimension.minecraft.the_end": "L'End", 10 | "minecraft.dimension.minecraft.the_nether": "Le Nether", 11 | "minecraft.dimension.minecraft.overworld": "Overworld", 12 | "minecraft.structure.minecraft.ancient_city": "Ancienne cité", 13 | "minecraft.structure.minecraft.bastion_remnant": "Vestiges de bastion", 14 | "minecraft.structure.minecraft.buried_treasure": "Trésor enfoui", 15 | "minecraft.structure.minecraft.desert_pyramid": "Pyramide du désert", 16 | "minecraft.structure.minecraft.end_city": "Cité de l'End", 17 | "minecraft.structure.minecraft.fortress": "Forteresse du Nether", 18 | "minecraft.structure.minecraft.igloo": "Igloo", 19 | "minecraft.structure.minecraft.jungle_pyramid": "Temple de la jungle", 20 | "minecraft.structure.minecraft.mansion": "Manoir", 21 | "minecraft.structure.minecraft.ocean_ruin_cold": "Ruine froide de l'océan", 22 | "minecraft.structure.minecraft.ocean_ruin_warm": "Ruine chaude de l'océan", 23 | "minecraft.structure.minecraft.pillager_outpost": "Avant-poste de pillards", 24 | "minecraft.structure.minecraft.shipwreck": "Épave de navire", 25 | "minecraft.structure.minecraft.shipwreck_beached": "Épave échouée", 26 | "minecraft.structure.minecraft.stronghold": "Fort", 27 | "minecraft.structure.minecraft.swamp_hut": "Cabane des marais", 28 | "minecraft.structure.minecraft.trail_ruins": "Ruines de sentier", 29 | "minecraft.structure.minecraft.trial_chambers": "Chambres des épreuves", 30 | "minecraft.structure.minecraft.village_desert": "Village du désert", 31 | "minecraft.structure.minecraft.village_plains": "Village des plaines", 32 | "minecraft.structure.minecraft.village_savanna": "Village de la savane", 33 | "minecraft.structure.minecraft.village_snowy": "Village enneigé", 34 | "minecraft.structure.minecraft.village_taiga": "Village de la Taïga", 35 | "locale.change_locale.title": "Changer de langue", 36 | "settings.mc_version.label": "Version :", 37 | "settings.mc_version.aria-label": "Version Minecraft", 38 | "settings.dev_mode.label": "Mode développeur :", 39 | "settings.dev_mode.aria-label": "Mode développeur", 40 | "settings.world_preset.label": "Préréglage :", 41 | "settings.world_preset.aria-label": "Préréglage", 42 | "settings.dimension.label": "Dimension :", 43 | "settings.dimension.aria-label": "Dimension", 44 | "settings.seed.label": "Graine :", 45 | "settings.seed.aria-label": "Graine", 46 | "footer.sponsor": "Parrainer", 47 | "dropdown.add.recents.empty": "Vide", 48 | "datapack_list.remove_datapack.title": "Supprimer le pack", 49 | "menu.add.title": "Ajouter un pack", 50 | "menu.search_biome.title": "Rechercher un biome", 51 | "menu.structure_positions.title": "Positions de la structure", 52 | "menu.reload_datapacks.title": "Recharger les packs", 53 | "dropdown.add.zip": "Ouvrir un pack/mod", 54 | "dropdown.add.picker.pack_and_mod": "Packs et Mods", 55 | "dropdown.add.picker.pack": "Packs (*.zip)", 56 | "dropdown.add.picker.mod": "Mods (*.jar)", 57 | "dropdown.add.built_in.update_1_20": "Mise à jour 1.20", 58 | "dropdown.add.built_in.title": "Datapacks intégré", 59 | "dropdown.add.recents.title": "Récemment utilisé", 60 | "dropdown.add.recents.not_found": "Pack introuvable. Suppression de la liste récemment utilisée.", 61 | "dropdown.add.recents.enable": "Activer", 62 | "dropdown.add.recents.enable.note": "(accepter le stockage local)", 63 | "dropdown.add.recents.unavailable": "Non prise en charge sur ce navigateur", 64 | "dropdown.search_biome.placeholder": "Chercher un biome", 65 | "dropdown.structure_positions.placeholder": "Chercher une structure", 66 | "footer.legel.note": "OUTIL NON OFFICIEL DE MINECRAFT. NON APPROUVÉ PAR OU ASSOCIÉ À MOJANG OU MICROSOFT.", 67 | "footer.about": "À propos", 68 | "footer.view_source": "Voir le code Source", 69 | "footer.report_issue": "Signaler un problème", 70 | "footer.wiki": "Guide de compatibilité", 71 | "footer.other": "Autres outils", 72 | "footer.licenses": "Licences", 73 | "footer.translate": "Traduire", 74 | "map.info.teleport_command_copied": "Commande de téléportation copiée", 75 | "map.error.structures_unsupported": "Certaines structures sélectionnées ne sont pas prises en charge ! Désolé.", 76 | "map.tooltip.spawn": "Point d'apparition", 77 | "map.yslider.aria-label": "Niveau Y", 78 | "map.yslider.y-label": "Y : {y}", 79 | "map.setting.project": "Déplacer l'emplacement vers la surface", 80 | "map.setting.sealevel": "Afficher le niveau de la mer", 81 | "map.setting.hillshade": "Activer l'ombrage des collines", 82 | "dropdown.add.folder": "Ouvrir un dossier", 83 | "dropdown.add.built_in.update_1_21": "Mise à jour 1.21", 84 | "toggle_sidebar.title": "Basculer la barre latérale", 85 | "map.info.structures_hidden": "Certaines structures sont cachées. Zoomez pour en voir plus.", 86 | "footer.more": "plus…", 87 | "settings.mc_version.mc1_20_6": "Minecraft 1.20.6", 88 | "tip_message.kofi": "Offrez moi un café", 89 | "tip_message.message": "Si vous trouvez cette outil utile, j'accepte les dons !", 90 | "tip_message.github": "Sponsor", 91 | "tip_message.close": "Fermer", 92 | "map.setting.graticule": "Montrer la grille de région", 93 | "settings.mc_version.mc1_21_1": "Minecraft 1.21.1", 94 | "settings.mc_version.mc1_21_3": "Minecraft 1.21.3", 95 | "dropdown.add.recents.wrong_version": "Indisponible pour cette version ", 96 | "dropdown.add.modrinth": "Ouvrir de Modrinth", 97 | "dropdown.add.recents.type.zip": "fichier zip stocké dans le navigateur", 98 | "dropdown.add.built_in.winter_drop": "Winter Drop", 99 | "dropdown.add.recents.type.folder": "dossier datapack ouvert directement à partir du disque", 100 | "dropdown.add.recents.type.modrinth": "dernière version de modrinth", 101 | "modrinth.title": "Ouvrir de Modrinth", 102 | "modrinth.search.placeholder": "Rechercher Modrinth...", 103 | "modrinth.include-mods": "Inclure les mods", 104 | "modrinth.include-mods.aria-label": "Inclure les mods dans la recherche", 105 | "modrinth.include-mods.notice": "Tous les mods ne sont pas supportés par cette map", 106 | "modrinth.ignore-version.aria-label": "Ignorer la version de minecraft dans la recherche", 107 | "modrinth.search.aria-label": "Barre de recherche pour les datapacks sur Modrinth", 108 | "modrinth.ignore-version": "Ignorer la version de minecraft", 109 | "settings.mc_version.mc1_21_4": "Minecraft 1.21.4", 110 | "modrinth.ignore-version.notice": "Les datapacks pour d'autres versions peuvent ne pas fonctionner comme prévu" 111 | } 112 | -------------------------------------------------------------------------------- /locales/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "locale.local_name": "日本語", 3 | "locale.minecraft_locale": "ja_jp", 4 | "locale.change_locale.title": "言語選択", 5 | "settings.mc_version.label": "バージョン:", 6 | "settings.mc_version.mc1_19": "Minecraft 1.19.x", 7 | "settings.mc_version.mc1_20": "Minecraft 1.20 / 1.20.1", 8 | "settings.mc_version.mc1_20_2": "Minecraft 1.20.2", 9 | "settings.mc_version.mc1_20_4": "Minecraft 1.20.4", 10 | "settings.mc_version.mc1_20_6": "Minecraft 1.20.6", 11 | "settings.dev_mode.label": "開発者モード:", 12 | "settings.dev_mode.aria-label": "開発者モード", 13 | "settings.seed.randomize_button.title": "ランダムシード", 14 | "minecraft.dimension.minecraft.overworld": "オーバーワールド", 15 | "minecraft.dimension.minecraft.the_end": "ジ・エンド", 16 | "minecraft.dimension.minecraft.the_nether": "ネザー", 17 | "minecraft.structure.minecraft.ancient_city": "古代都市", 18 | "minecraft.structure.minecraft.bastion_remnant": "砦の遺跡", 19 | "minecraft.structure.minecraft.buried_treasure": "埋もれた宝", 20 | "minecraft.structure.minecraft.desert_pyramid": "砂漠の寺院", 21 | "minecraft.structure.minecraft.end_city": "エンドシティ", 22 | "minecraft.structure.minecraft.fortress": "ネザー要塞", 23 | "minecraft.structure.minecraft.igloo": "イグルー", 24 | "minecraft.structure.minecraft.jungle_pyramid": "ジャングルの寺院", 25 | "minecraft.structure.minecraft.mansion": "森の洋館", 26 | "minecraft.structure.minecraft.ocean_ruin_cold": "海底遺跡", 27 | "minecraft.structure.minecraft.ocean_ruin_warm": "海底遺跡", 28 | "minecraft.structure.minecraft.pillager_outpost": "ピリジャーの前哨基地", 29 | "minecraft.structure.minecraft.shipwreck": "難破船", 30 | "minecraft.structure.minecraft.shipwreck_beached": "座礁した難破船", 31 | "minecraft.structure.minecraft.stronghold": "要塞", 32 | "minecraft.structure.minecraft.trail_ruins": "旅路の遺跡", 33 | "minecraft.structure.minecraft.trial_chambers": "試練の間", 34 | "minecraft.structure.minecraft.village_desert": "砂漠の村", 35 | "minecraft.structure.minecraft.village_plains": "平原の村", 36 | "minecraft.structure.minecraft.village_savanna": "サバンナの村", 37 | "minecraft.structure.minecraft.village_snowy": "雪原の村", 38 | "footer.about": "概要", 39 | "footer.view_source": "ソースコードを表示", 40 | "footer.report_issue": "問題を報告", 41 | "footer.wiki": "互換性について", 42 | "footer.other": "その他のツール", 43 | "footer.licenses": "ライセンス", 44 | "footer.translate": "翻訳", 45 | "footer.sponsor": "スポンサー", 46 | "footer.more": "もっと見る…", 47 | "datapack_list.remove_datapack.title": "パッケージを削除", 48 | "menu.add.title": "パッケージを追加", 49 | "menu.search_biome.title": "バイオームを検索", 50 | "menu.structure_positions.title": "構造物の位置", 51 | "menu.reload_datapacks.title": "パッケージを再読み込み", 52 | "dropdown.add.zip": "datapackまたはmodを開く", 53 | "dropdown.add.picker.pack_and_mod": "datapackとmod", 54 | "dropdown.add.picker.pack": "datapacks (*.zip)", 55 | "dropdown.add.picker.mod": "mods (*.jar)", 56 | "dropdown.add.folder": "フォルダーを開く", 57 | "dropdown.add.built_in.update_1_20": "1.20アップデート", 58 | "dropdown.add.built_in.update_1_21": "1.21アップデート", 59 | "dropdown.add.built_in.title": "内蔵datapack", 60 | "dropdown.add.recents.title": "最近使用したもの", 61 | "dropdown.add.recents.not_found": "パッケージが見つかりません。最近使用したリストから削除します。", 62 | "dropdown.add.recents.enable": "有効にする", 63 | "dropdown.add.recents.empty": "空", 64 | "dropdown.add.recents.unavailable": "このブラウザはサポートされていません", 65 | "dropdown.search_biome.placeholder": "バイオームを検索", 66 | "dropdown.structure_positions.placeholder": "構造物を検索", 67 | "toggle_sidebar.title": "サイドバーを切り替え", 68 | "map.info.structures_hidden": "一部の構造物は非表示です。拡大して詳細を表示してください。", 69 | "map.info.teleport_command_copied": "テレポートコマンドがコピーされました", 70 | "map.tooltip.spawn": "初期スポーン", 71 | "map.setting.project": "テレポートの高さを地表にする", 72 | "settings.mc_version.aria-label": "Minecraftのバージョン", 73 | "settings.world_preset.aria-label": "ワールドプリセット", 74 | "settings.dimension.label": "ディメンション:", 75 | "settings.dimension.aria-label": "ディメンション", 76 | "settings.seed.label": "シード値:", 77 | "settings.seed.aria-label": "シード値", 78 | "map.yslider.aria-label": "Yレベル", 79 | "map.yslider.y-label": "Y: {y}", 80 | "map.setting.sealevel": "海面を表示", 81 | "map.setting.hillshade": "陰影を有効にする", 82 | "tip_message.message": "この地図が役に立った場合、チップをいただけると嬉しいです!", 83 | "tip_message.kofi": "コーヒーをおごる", 84 | "tip_message.github": "スポンサー", 85 | "tip_message.close": "閉じる", 86 | "settings.world_preset.label": "プリセット:", 87 | "minecraft.structure.minecraft.swamp_hut": "ウィッチの小屋", 88 | "minecraft.structure.minecraft.village_taiga": "タイガの村", 89 | "footer.legel.note": "Minecraft公式のツールではありません。MojangまたはMicrosoftによって承認または関連するものではありません。", 90 | "dropdown.add.recents.enable.note": "(ローカルストレージの使用を許可)", 91 | "map.error.structures_unsupported": "選択された構造物の一部はサポートされていません。申し訳ありません。", 92 | "settings.mc_version.mc1_21_1": "Minecraft 1.21.1", 93 | "settings.mc_version.mc1_21_3": "Minecraft 1.21.3", 94 | "settings.mc_version.mc1_21_4": "Minecraft 1.21.4", 95 | "map.setting.graticule": "グリッド線を表示", 96 | "dropdown.add.modrinth": "Modrinthから開く", 97 | "dropdown.add.built_in.winter_drop": "Winter Drop", 98 | "dropdown.add.recents.type.zip": "ブラウザに保管されたzipファイル", 99 | "dropdown.add.recents.type.folder": "ローカルディスクから開かれたdatapackフォルダ", 100 | "dropdown.add.recents.type.modrinth": "modrinth上の最新バージョン", 101 | "dropdown.add.recents.wrong_version": "このバージョンでは使用できません ", 102 | "modrinth.title": "Modrinthから開く", 103 | "modrinth.search.placeholder": "Modrinthを検索...", 104 | "modrinth.include-mods": "modを含める", 105 | "modrinth.search.aria-label": "Modrinth上のdatapackの検索バー", 106 | "modrinth.ignore-version.aria-label": "検索でMinecraftのバージョンを無視する", 107 | "modrinth.ignore-version": "Minecraftのバージョンを無視", 108 | "modrinth.ignore-version.notice": "他のバージョンのデータパックでは正常に動作しない可能性があります", 109 | "modrinth.include-mods.aria-label": "modを含めて検索", 110 | "modrinth.include-mods.notice": "Datapack Mapではすべての MOD がサポートされているわけではありません", 111 | "settings.mc_version.mc1_21_5": "Minecraft 1.21.5" 112 | } 113 | -------------------------------------------------------------------------------- /locales/pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "map.error.structures_unsupported": "Alguma das estruturas selecionadas não tem suporte! Desculpe.", 3 | "locale.local_name": "Português (Brasil)", 4 | "locale.minecraft_locale": "pt_br", 5 | "locale.change_locale.title": "Alterar idioma", 6 | "settings.mc_version.label": "Versão:", 7 | "settings.mc_version.aria-label": "Versão do Minecraft", 8 | "settings.mc_version.mc1_19": "Minecraft 1.19.x", 9 | "settings.mc_version.mc1_20": "Minecraft 1.20/1.20.1", 10 | "settings.mc_version.mc1_20_2": "Minecraft 1.20.2", 11 | "settings.mc_version.mc1_20_4": "Minecraft 1.20.4", 12 | "settings.dev_mode.label": "Modo de desenvolvedor:", 13 | "settings.dev_mode.aria-label": "Modo de desenvolvedor", 14 | "settings.world_preset.label": "Predef. do mundo:", 15 | "settings.seed.randomize_button.title": "Semente aleatória", 16 | "minecraft.dimension.minecraft.overworld": "Superfície", 17 | "minecraft.dimension.minecraft.the_end": "O End", 18 | "minecraft.dimension.minecraft.the_nether": "O Nether", 19 | "minecraft.structure.minecraft.ancient_city": "Cidade ancestral", 20 | "minecraft.structure.minecraft.bastion_remnant": "Bastião em ruínas", 21 | "minecraft.structure.minecraft.buried_treasure": "Tesouro enterrado", 22 | "minecraft.structure.minecraft.desert_pyramid": "Templo do deserto", 23 | "minecraft.structure.minecraft.end_city": "Cidade do End", 24 | "minecraft.structure.minecraft.fortress": "Fortaleza do Nether", 25 | "minecraft.structure.minecraft.jungle_pyramid": "Templo da selva", 26 | "minecraft.structure.minecraft.mansion": "Mansão da floresta", 27 | "minecraft.structure.minecraft.ocean_ruin_cold": "Ruína oceânica fria", 28 | "minecraft.structure.minecraft.ocean_ruin_warm": "Ruína oceânica quente", 29 | "minecraft.structure.minecraft.pillager_outpost": "Posto de saqueadores", 30 | "minecraft.structure.minecraft.shipwreck": "Naufrágio", 31 | "minecraft.structure.minecraft.shipwreck_beached": "Naufrágio encalhado", 32 | "minecraft.structure.minecraft.stronghold": "Fortaleza", 33 | "minecraft.structure.minecraft.swamp_hut": "Cabana do pântano", 34 | "minecraft.structure.minecraft.trail_ruins": "Trilha em ruínas", 35 | "minecraft.structure.minecraft.trial_chambers": "Câmaras do desafio", 36 | "minecraft.structure.minecraft.village_desert": "Vila do deserto", 37 | "minecraft.structure.minecraft.village_plains": "Vila da planície", 38 | "minecraft.structure.minecraft.village_savanna": "Vila da savana", 39 | "minecraft.structure.minecraft.village_snowy": "Vila nevada", 40 | "minecraft.structure.minecraft.village_taiga": "Vila da taiga", 41 | "footer.legel.note": "NÃO SE TRATA DE FERRAMENTA OFICIAL DA MINECRAFT. NÃO APROVADO NEM ASSOCIADO À MOJANG OU À MICROSOFT.", 42 | "footer.about": "Sobre", 43 | "footer.view_source": "Ver código", 44 | "footer.report_issue": "Reportar um problema", 45 | "footer.wiki": "Guia de compatibilidade", 46 | "footer.other": "Outras ferramentas", 47 | "footer.licenses": "Licenças", 48 | "footer.translate": "Tradução", 49 | "footer.sponsor": "Sponsor", 50 | "datapack_list.remove_datapack.title": "Remover pacote", 51 | "menu.add.title": "Adicionar pacote", 52 | "menu.search_biome.title": "Procurar bioma", 53 | "menu.structure_positions.title": "Posição das estruturas", 54 | "menu.reload_datapacks.title": "Recarregar pacotes", 55 | "dropdown.add.zip": "Carregar pacote ou mod", 56 | "dropdown.add.picker.pack_and_mod": "Pacotes e mods", 57 | "dropdown.add.picker.pack": "Pacotes (*.zip)", 58 | "dropdown.add.picker.mod": "Mods (*.jar)", 59 | "dropdown.add.folder": "Carregar pasta", 60 | "dropdown.add.built_in.update_1_20": "Atualização 1.20", 61 | "dropdown.add.built_in.update_1_21": "Atualização 1.21", 62 | "dropdown.add.built_in.title": "Pacotes de dados integrados", 63 | "dropdown.add.recents.title": "Usado recentemente", 64 | "dropdown.add.recents.not_found": "Pacote não encontrado. Removido da lista de usado recentemente.", 65 | "dropdown.add.recents.enable": "Ativar", 66 | "dropdown.add.recents.enable.note": "(aceitar armazenamento local)", 67 | "dropdown.add.recents.empty": "Vazio", 68 | "dropdown.add.recents.unavailable": "Sem suporte neste navegador", 69 | "dropdown.search_biome.placeholder": "Procurar bioma", 70 | "dropdown.structure_positions.placeholder": "Procurar estrutura", 71 | "toggle_sidebar.title": "Alterar a barra lateral", 72 | "map.info.structures_hidden": "Algumas estruturas estão ocultas. Use o zoom para ver mais.", 73 | "map.info.teleport_command_copied": "Copiado o comando de teletransporte", 74 | "settings.world_preset.aria-label": "Predef. do mundo", 75 | "settings.dimension.label": "Dimensão:", 76 | "settings.dimension.aria-label": "Dimensão", 77 | "settings.seed.label": "Semente:", 78 | "settings.seed.aria-label": "Semente", 79 | "map.tooltip.spawn": "Ponto de nascimento", 80 | "map.yslider.aria-label": "Camada Y", 81 | "map.yslider.y-label": "Y: {y}", 82 | "map.setting.project": "Mover a localização para a superfície", 83 | "map.setting.sealevel": "Mostrar na camada do mar", 84 | "map.setting.hillshade": "Ativar sombreamento", 85 | "minecraft.structure.minecraft.igloo": "Iglu", 86 | "footer.more": "mais…", 87 | "settings.mc_version.mc1_20_6": "Minecraft 1.20.6", 88 | "tip_message.message": "Se você achar este mapa útil, eu agradeceria uma gorjeta!", 89 | "tip_message.kofi": "Buy Me a Coffee", 90 | "tip_message.close": "Fechar", 91 | "tip_message.github": "Sponsor", 92 | "map.setting.graticule": "Mostrar grade de região", 93 | "dropdown.add.built_in.winter_drop": "Drop de Fim de Ano", 94 | "settings.mc_version.mc1_21_1": "Minecraft 1.21.1", 95 | "settings.mc_version.mc1_21_3": "Minecraft 1.21.3", 96 | "dropdown.add.modrinth": "Abrir a partir do Modrinth", 97 | "modrinth.title": "Abrir a partir do Modrinth", 98 | "dropdown.add.recents.type.modrinth": "versão mais recente do modrinth", 99 | "dropdown.add.recents.wrong_version": "indisponível para esta versão ", 100 | "modrinth.include-mods": "incluir mods", 101 | "modrinth.include-mods.aria-label": "incluir mods na pesquisa", 102 | "modrinth.include-mods.notice": "Nem todos os mods são compatíveis com este mapa", 103 | "modrinth.ignore-version": "ignorar a versão do minecraft", 104 | "modrinth.ignore-version.notice": "Pacotes de dados para outras versões podem não funcionar como esperado", 105 | "modrinth.ignore-version.aria-label": "ignorar a versão do minecraft na pesquisa", 106 | "settings.mc_version.mc1_21_4": "Minecraft 1.21.4", 107 | "modrinth.search.aria-label": "Barra de pesquisa para pacotes de dados no Modrinth", 108 | "dropdown.add.recents.type.zip": "arquivo zip armazenado no navegador", 109 | "dropdown.add.recents.type.folder": "pasta datapack aberta diretamente do disco", 110 | "modrinth.search.placeholder": "Pesquisar no Modrinth..." 111 | } 112 | -------------------------------------------------------------------------------- /locales/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "map.setting.sealevel": "Показать уровень моря", 3 | "minecraft.dimension.minecraft.overworld": "Обычный мир", 4 | "minecraft.structure.minecraft.ancient_city": "Древний город", 5 | "settings.seed.aria-label": "Ключ", 6 | "settings.seed.randomize_button.title": "Случайное значение", 7 | "minecraft.structure.minecraft.bastion_remnant": "Развалины бастиона", 8 | "minecraft.structure.minecraft.buried_treasure": "Клад", 9 | "minecraft.structure.minecraft.desert_pyramid": "Пустынный храм", 10 | "minecraft.structure.minecraft.end_city": "Город Энда", 11 | "minecraft.dimension.minecraft.the_end": "Энд", 12 | "minecraft.dimension.minecraft.the_nether": "Незер", 13 | "minecraft.structure.minecraft.fortress": "Крепость Незера", 14 | "minecraft.structure.minecraft.igloo": "Иглу", 15 | "minecraft.structure.minecraft.jungle_pyramid": "Тропический храм", 16 | "minecraft.structure.minecraft.mansion": "Лесной особняк", 17 | "minecraft.structure.minecraft.ocean_ruin_warm": "Руины тёплого океана", 18 | "minecraft.structure.minecraft.pillager_outpost": "Аванпост разбойников", 19 | "minecraft.structure.minecraft.shipwreck": "Затонувший корабль", 20 | "minecraft.structure.minecraft.shipwreck_beached": "Закопанный корабль", 21 | "minecraft.structure.minecraft.stronghold": "Крепость", 22 | "minecraft.structure.minecraft.swamp_hut": "Хижина ведьмы", 23 | "minecraft.structure.minecraft.trial_chambers": "Дворец испытаний", 24 | "minecraft.structure.minecraft.village_desert": "Пустынная деревня", 25 | "locale.local_name": "Русский", 26 | "locale.minecraft_locale": "ru_ru", 27 | "locale.change_locale.title": "Смена языка", 28 | "settings.mc_version.mc1_19": "Minecraft 1.19.х", 29 | "settings.mc_version.mc1_20": "Minecraft 1.20 / 1.20.1", 30 | "settings.mc_version.mc1_20_2": "Minecraft 1.20.2", 31 | "settings.mc_version.mc1_20_4": "Minecraft 1.20.4", 32 | "map.tooltip.spawn": "Точка возрождения", 33 | "map.setting.project": "Опуститься на поверхность", 34 | "map.setting.hillshade": "Включить затемнение склонов", 35 | "settings.mc_version.label": "Версия:", 36 | "settings.mc_version.aria-label": "Версия Minecraft", 37 | "settings.dimension.label": "Измерение:", 38 | "settings.dimension.aria-label": "Измерение", 39 | "settings.seed.label": "Ключ:", 40 | "minecraft.structure.minecraft.village_plains": "Равнинная деревня", 41 | "minecraft.structure.minecraft.village_savanna": "Саванная деревня", 42 | "minecraft.structure.minecraft.village_snowy": "Заснеженная деревня", 43 | "footer.about": "О нас", 44 | "footer.view_source": "Исходный код", 45 | "footer.report_issue": "Проблемы", 46 | "footer.wiki": "Руководство по совместимости", 47 | "footer.other": "Другие утилиты", 48 | "footer.licenses": "Права", 49 | "footer.translate": "Перевод", 50 | "footer.sponsor": "Спонсорство", 51 | "datapack_list.remove_datapack.title": "Убрать набор", 52 | "menu.add.title": "Добавить набор", 53 | "menu.search_biome.title": "Поиск биома", 54 | "menu.structure_positions.title": "Расположение строений", 55 | "menu.reload_datapacks.title": "Перезагрузить наборы", 56 | "dropdown.add.zip": "Открыть набор или мод", 57 | "dropdown.add.picker.pack": "Наборы (*.zip)", 58 | "dropdown.add.picker.mod": "Моды (*.jar)", 59 | "dropdown.add.folder": "Открыть папку", 60 | "dropdown.add.built_in.update_1_20": "Обновление 1.20", 61 | "dropdown.add.built_in.update_1_21": "Обновление 1.21", 62 | "dropdown.add.recents.title": "Недавно использованные", 63 | "dropdown.add.recents.enable": "Включить", 64 | "dropdown.add.recents.enable.note": "(разрешить локальное хранилище)", 65 | "dropdown.add.recents.empty": "Пусто", 66 | "dropdown.add.recents.unavailable": "Не поддерживается браузером", 67 | "dropdown.search_biome.placeholder": "Поиск биомов", 68 | "dropdown.structure_positions.placeholder": "Поиск строений", 69 | "toggle_sidebar.title": "Переключить боковую панель", 70 | "map.info.teleport_command_copied": "Скопирована команда для телепортации", 71 | "map.error.structures_unsupported": "Некоторые выбранные строения не поддерживаются! Приносим извинения.", 72 | "map.yslider.aria-label": "Уровень Y", 73 | "map.yslider.y-label": "Y: {y}", 74 | "settings.dev_mode.label": "Режим разработчика:", 75 | "settings.dev_mode.aria-label": "Режим разработчика", 76 | "settings.world_preset.label": "Тип мира:", 77 | "settings.world_preset.aria-label": "Тип мира", 78 | "minecraft.structure.minecraft.ocean_ruin_cold": "Руины холодного океана", 79 | "minecraft.structure.minecraft.trail_ruins": "Руины былых времён", 80 | "minecraft.structure.minecraft.village_taiga": "Таёжная деревня", 81 | "footer.legel.note": "НЕ ЯВЛЯЕТСЯ ОФИЦИАЛЬНОЙ УТИЛИТОЙ MINECRAFT. НЕ ОДОБРЕНА И НЕ СВЯЗАНА С КОМПАНИЕЙ MOJANG ИЛИ MICROSOFT.", 82 | "dropdown.add.picker.pack_and_mod": "Наборы и моды", 83 | "dropdown.add.built_in.title": "Встроенные наборы данных", 84 | "dropdown.add.recents.not_found": "Набор не найден. Удаление из недавно использованных.", 85 | "map.info.structures_hidden": "Некоторые строения скрыты. Приблизьте, чтобы увидеть больше.", 86 | "footer.more": "ещё…", 87 | "settings.mc_version.mc1_20_6": "Minecraft 1.20.6", 88 | "tip_message.kofi": "Купи мне Кофе", 89 | "tip_message.message": "Если тебе помогла эта карта, я бы не отказался от чаевых!", 90 | "tip_message.github": "Спонсор", 91 | "map.setting.graticule": "Показать сетку регионов", 92 | "tip_message.close": "Закрыть", 93 | "dropdown.add.built_in.winter_drop": "Зимний дроп", 94 | "settings.mc_version.mc1_21_1": "Minecraft 1.21.1", 95 | "settings.mc_version.mc1_21_3": "Minecraft 1.21.3", 96 | "dropdown.add.modrinth": "Открыть в Modrinth", 97 | "dropdown.add.recents.type.zip": "zip файл хранящийся в браузере", 98 | "dropdown.add.recents.type.folder": "папка набора открываемая с диска", 99 | "dropdown.add.recents.type.modrinth": "новейшая версия из modrinth", 100 | "dropdown.add.recents.wrong_version": "недоступно для этой версии ", 101 | "modrinth.title": "Открыть из Modrinth", 102 | "modrinth.search.placeholder": "Искать в Modrinth...", 103 | "modrinth.include-mods.notice": "Не все моды поддерживаются этой картой", 104 | "modrinth.ignore-version": "игнорировать minecraft версию", 105 | "modrinth.ignore-version.notice": "Наборы для других версий могут не работать как ожидается", 106 | "modrinth.include-mods": "включить моды", 107 | "modrinth.include-mods.aria-label": "включить моды в поиск", 108 | "modrinth.search.aria-label": "Панель поиска наборов в Modrinth", 109 | "modrinth.ignore-version.aria-label": "игнорировать minecraft версию в поиске" 110 | } 111 | -------------------------------------------------------------------------------- /locales/th.json: -------------------------------------------------------------------------------- 1 | { 2 | "modrinth.include-mods.notice": "ไม่ใช่ทุกม็อดที่รองรับแผนที่นี้", 3 | "map.info.structures_hidden": "สิ่งก่อสร้างบางส่วนถูกซ่อนไว้ ซูมเข้าเพื่อดูเพิ่มเติม", 4 | "map.error.structures_unsupported": "ขออภัย สิ่งก่อสร้างบางส่วนที่เลือกไว้ไม่รองรับ", 5 | "tip_message.message": "หากคุณพบว่าแผนที่นี้มีประโยชน์ ฉันจะขอบคุณมากสำหรับทิป!", 6 | "locale.local_name": "ไทย", 7 | "locale.minecraft_locale": "th_th", 8 | "locale.change_locale.title": "เปลี่ยนภาษา", 9 | "settings.mc_version.mc1_19": "Minecraft 1.19.x", 10 | "settings.mc_version.mc1_20": "Minecraft 1.20 / 1.20.1", 11 | "settings.mc_version.mc1_20_2": "Minecraft 1.20.2", 12 | "settings.mc_version.mc1_20_4": "Minecraft 1.20.4", 13 | "settings.mc_version.mc1_20_6": "Minecraft 1.20.6", 14 | "settings.mc_version.mc1_21_1": "Minecraft 1.21.1", 15 | "settings.mc_version.mc1_21_3": "Minecraft 1.21.3", 16 | "settings.mc_version.mc1_21_4": "Minecraft 1.21.4", 17 | "settings.mc_version.mc1_21_5": "Minecraft 1.21.5", 18 | "settings.seed.randomize_button.title": "สุ่มเมล็ดพันธุ์", 19 | "minecraft.dimension.minecraft.overworld": "โลกปกติ", 20 | "minecraft.dimension.minecraft.the_end": "ดิเอนด์", 21 | "minecraft.dimension.minecraft.the_nether": "เนเธอร์", 22 | "minecraft.structure.minecraft.ancient_city": "เมืองโบราณ", 23 | "minecraft.structure.minecraft.bastion_remnant": "ซากป้อมปราการ", 24 | "minecraft.structure.minecraft.buried_treasure": "สมบัติที่ถูกฝัง", 25 | "minecraft.structure.minecraft.desert_pyramid": "พีระมิดทะเลทราย", 26 | "minecraft.structure.minecraft.end_city": "เอนด์ซิตี้", 27 | "minecraft.structure.minecraft.fortress": "ป้อมปราการเนเธอร์", 28 | "minecraft.structure.minecraft.igloo": "อิกลู", 29 | "minecraft.structure.minecraft.jungle_pyramid": "วัดป่า", 30 | "minecraft.structure.minecraft.mansion": "คฤหาสน์วูดแลนด์", 31 | "minecraft.structure.minecraft.ocean_ruin_cold": "ซากปรักหักพังของมหาสมุทรอันเย็นยะเยือก", 32 | "minecraft.structure.minecraft.ocean_ruin_warm": "ซากปรักหักพังของมหาสมุทรอันอบอุ่น", 33 | "minecraft.structure.minecraft.pillager_outpost": "ด่านปล้นสะดม", 34 | "minecraft.structure.minecraft.shipwreck": "เรืออับปาง", 35 | "minecraft.structure.minecraft.shipwreck_beached": "เรืออับปางเกยตื้น", 36 | "minecraft.structure.minecraft.stronghold": "สตรองโฮลด์", 37 | "minecraft.structure.minecraft.swamp_hut": "กระท่อมหนองบึง", 38 | "minecraft.structure.minecraft.trail_ruins": "ซากปรักหักพังใต้ดิน", 39 | "minecraft.structure.minecraft.trial_chambers": "ห้องทดลอง", 40 | "minecraft.structure.minecraft.village_desert": "หมู่บ้านทะเลทราย", 41 | "minecraft.structure.minecraft.village_plains": "หมู่บ้านที่ราบ", 42 | "minecraft.structure.minecraft.village_savanna": "หมู่บ้านสะวันนา", 43 | "footer.about": "เกี่ยวกับ", 44 | "footer.view_source": "ดูซอร์สโค้ด", 45 | "footer.report_issue": "รายงานปัญหา", 46 | "footer.wiki": "คู่มือความเข้ากันได้", 47 | "footer.other": "เครื่องมืออื่นๆ", 48 | "footer.licenses": "ใบอนุญาต", 49 | "footer.translate": "แปลภาษา", 50 | "footer.sponsor": "ผู้สนับสนุน", 51 | "menu.add.title": "เพิ่มดาต้าแพ็ค", 52 | "menu.search_biome.title": "ค้นหาไบโอม", 53 | "menu.structure_positions.title": "ตำแหน่งสิ่งก่อสร้าง", 54 | "dropdown.add.zip": "เปิดดาต้าแพ็คหรือมอด", 55 | "dropdown.add.picker.pack_and_mod": "ดาต้าแพ็คหรือมอด", 56 | "dropdown.add.picker.pack": "ดาต้าแพ็ค (*.zip)", 57 | "dropdown.add.picker.mod": "มอด (*.jar)", 58 | "dropdown.add.modrinth": "เปิดจาก Modrinth", 59 | "dropdown.add.built_in.update_1_20": "อัพเดต 1.20", 60 | "dropdown.add.built_in.update_1_21": "อัพเดต 1.21", 61 | "dropdown.add.built_in.winter_drop": "วินเทอร์ดรอป", 62 | "dropdown.add.recents.title": "ใช้เมื่อเร็ว ๆ นี้", 63 | "settings.mc_version.label": "เวอร์ชั่น:", 64 | "settings.dev_mode.label": "โหมดผู้พัฒนา:", 65 | "dropdown.add.recents.not_found": "ไม่พบดาต้าแพ็ค กำลังลบออกจากรายการที่ใช้ล่าสุด", 66 | "dropdown.add.recents.enable": "เปิดใช้งาน", 67 | "dropdown.add.recents.enable.note": "(อนุญาตให้จัดเก็บข้อมูลภายในเครื่อง)", 68 | "dropdown.add.recents.empty": "ว่าง", 69 | "dropdown.add.recents.unavailable": "เบราว์เซอร์นี้ไม่รองรับ", 70 | "dropdown.add.recents.type.zip": "ไฟล์ zip ถูกเก็บไว้ในเบราว์เซอร์", 71 | "dropdown.add.recents.type.folder": "โฟลเดอร์ดาต้าแพ็คเปิดโดยตรงจากดิสก์", 72 | "settings.mc_version.aria-label": "เวอร์ชัน Minecraft", 73 | "dropdown.add.recents.type.modrinth": "เวอร์ชันใหม่ล่าสุดจาก modrinth", 74 | "dropdown.add.recents.wrong_version": "ไม่พร้อมใช้งานสำหรับเวอร์ชันนี้ ", 75 | "dropdown.search_biome.placeholder": "ค้นหาไบโอม", 76 | "dropdown.structure_positions.placeholder": "ค้นหาสิ่งก่อสร้าง", 77 | "modrinth.title": "เปิดจาก Modrinth", 78 | "modrinth.search.placeholder": "ค้นหา Modrinth...", 79 | "modrinth.ignore-version.notice": "ดาต้าแพ็คสำหรับเวอร์ชันอื่นอาจไม่ทำงานตามที่คาดหวัง", 80 | "toggle_sidebar.title": "สลับแถบด้านข้าง", 81 | "map.info.teleport_command_copied": "คัดลอกคำสั่งเทเลพอร์ตแล้ว", 82 | "map.tooltip.spawn": "จุดเกิด", 83 | "map.setting.project": "ย้ายตำแหน่งลงสู่พื้นผิว", 84 | "map.setting.sealevel": "แสดงระดับน้ำทะเล", 85 | "map.setting.hillshade": "เปิดใช้งานการแรเงาเนินเขา", 86 | "map.setting.graticule": "แสดงเส้นกริดภูมิภาค", 87 | "tip_message.kofi": "ซื้อกาแฟให้ฉัน", 88 | "tip_message.github": "ผู้สนับสนุน", 89 | "tip_message.close": "ไม่สนใจ", 90 | "settings.dev_mode.aria-label": "โหมดผู้พัฒนา", 91 | "settings.world_preset.label": "โลกที่ตั้งไว้ล่วงหน้า:", 92 | "settings.world_preset.aria-label": "โลกที่ตั้งไว้ล่วงหน้า", 93 | "settings.dimension.label": "มิติ:", 94 | "settings.dimension.aria-label": "มิติ", 95 | "settings.seed.label": "เมล็ดพันธุ์:", 96 | "settings.seed.aria-label": "เมล็ดพันธุ์", 97 | "modrinth.search.aria-label": "แถบค้นหาสำหรับดาต้าแพ็คใน Modrinth", 98 | "modrinth.include-mods": "รวมม็อด", 99 | "modrinth.include-mods.aria-label": "รวมม็อดไว้ในการค้นหา", 100 | "modrinth.ignore-version": "ไม่สนใจเวอร์ชัน Minecraft", 101 | "modrinth.ignore-version.aria-label": "ไม่สนใจเวอร์ชัน Minecraft ในการค้นหา", 102 | "map.yslider.aria-label": "แกน Y", 103 | "map.yslider.y-label": "Y: {y}", 104 | "minecraft.structure.minecraft.village_snowy": "หมู่บ้านหิมะ", 105 | "minecraft.structure.minecraft.village_taiga": "หมู่บ้านไทกา", 106 | "footer.legel.note": "NOT AN OFFICIAL MINECRAFT TOOL. NOT APPROVED BY OR ASSOCIATED WITH MOJANG OR MICROSOFT.", 107 | "footer.more": "เพิ่มเติม…", 108 | "datapack_list.remove_datapack.title": "ลบดาต้าแพ็ค", 109 | "menu.reload_datapacks.title": "รีโหลดดาต้าแพ็ค", 110 | "dropdown.add.folder": "เปิดโฟลเดอร์", 111 | "dropdown.add.built_in.title": "ดาต้าแพ็กในตัว" 112 | } 113 | -------------------------------------------------------------------------------- /locales/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "locale.local_name": "Türkçe", 3 | "locale.minecraft_locale": "tr_tr", 4 | "locale.change_locale.title": "Dil Seç", 5 | "settings.mc_version.mc1_19": "Minecraft 1.19.x", 6 | "settings.mc_version.mc1_20": "Minecraft 1.20 / 1.20.1", 7 | "settings.mc_version.mc1_20_2": "Minecraft 1.20.2", 8 | "settings.mc_version.mc1_20_4": "Minecraft 1.20.4", 9 | "settings.mc_version.mc1_20_6": "Minecraft 1.20.6", 10 | "settings.seed.randomize_button.title": "Rasgele tohum", 11 | "minecraft.dimension.minecraft.overworld": "Overworld", 12 | "minecraft.dimension.minecraft.the_end": "End", 13 | "minecraft.dimension.minecraft.the_nether": "Nether", 14 | "minecraft.structure.minecraft.ancient_city": "Antik Kent", 15 | "minecraft.structure.minecraft.bastion_remnant": "Burç Kalıntıları", 16 | "minecraft.structure.minecraft.buried_treasure": "Gömülü Hazine", 17 | "minecraft.structure.minecraft.desert_pyramid": "Çöl Piramidi", 18 | "minecraft.structure.minecraft.end_city": "End Şehri", 19 | "minecraft.structure.minecraft.fortress": "Nether Kalesi", 20 | "minecraft.structure.minecraft.igloo": "İglo", 21 | "minecraft.structure.minecraft.jungle_pyramid": "Orman Tapınağı", 22 | "minecraft.structure.minecraft.mansion": "Malikane", 23 | "minecraft.structure.minecraft.ocean_ruin_warm": "Sıcak Okyanus Harabesi", 24 | "minecraft.structure.minecraft.pillager_outpost": "Yağmacı Karakolu", 25 | "minecraft.structure.minecraft.shipwreck": "Gemi Enkazı", 26 | "minecraft.structure.minecraft.shipwreck_beached": "Karaya Vurmuş Gemi Enkazı", 27 | "minecraft.structure.minecraft.stronghold": "Stronghold", 28 | "minecraft.structure.minecraft.swamp_hut": "Bataklık Kulübesi", 29 | "minecraft.structure.minecraft.trail_ruins": "Patika Kalıntıları", 30 | "minecraft.structure.minecraft.village_desert": "Çöl Köyü", 31 | "minecraft.structure.minecraft.village_plains": "Ova Köyü", 32 | "minecraft.structure.minecraft.village_snowy": "Karlı Köy", 33 | "minecraft.structure.minecraft.village_taiga": "Tayga Köyü", 34 | "footer.about": "Hakkında", 35 | "footer.view_source": "Kaynak Kodu", 36 | "settings.mc_version.label": "Sürüm:", 37 | "settings.mc_version.aria-label": "Minecraft Sürümü:", 38 | "settings.dev_mode.label": "Geliştirici modu:", 39 | "settings.dev_mode.aria-label": "Geliştirici Modu", 40 | "footer.report_issue": "Hata Bildir", 41 | "footer.wiki": "Uyumluluk Kılavuzu", 42 | "footer.other": "Diğer Araçlar", 43 | "footer.licenses": "Lisanslar", 44 | "footer.translate": "Çeviri", 45 | "footer.sponsor": "Sponsor", 46 | "footer.more": "fazlası…", 47 | "datapack_list.remove_datapack.title": "Paketi kaldır", 48 | "menu.add.title": "Paket Ekle", 49 | "menu.search_biome.title": "Biyom Ara", 50 | "menu.structure_positions.title": "Yapı Pozisyonları", 51 | "dropdown.add.zip": "Veri Paketi veya Mod Aç", 52 | "dropdown.add.picker.pack_and_mod": "Veri Paketleri ve Modlar", 53 | "dropdown.add.picker.pack": "Paketler (*.zip)", 54 | "dropdown.add.picker.mod": "Modlar (*.jar)", 55 | "dropdown.add.folder": "Klasör seç", 56 | "dropdown.add.built_in.update_1_20": "1.20 Güncellemesi", 57 | "dropdown.add.built_in.update_1_21": "1.21 Güncellemesi", 58 | "dropdown.add.recents.title": "Yakın zamanda kullanılan", 59 | "dropdown.add.recents.not_found": "Paket Bulunamadı. Son kullanılanlar listesinden kaldırılıyor.", 60 | "dropdown.add.recents.enable": "Etkinleştir", 61 | "dropdown.add.recents.enable.note": "(yerel depolamayı kabul et)", 62 | "dropdown.add.recents.empty": "Boş", 63 | "dropdown.search_biome.placeholder": "Biyom Ara", 64 | "dropdown.structure_positions.placeholder": "Yapı Ara", 65 | "toggle_sidebar.title": "Kenar Çubuğunu Gizle/Göster", 66 | "map.info.structures_hidden": "Bazı yapılar gizlenmiştir. Daha fazlasını görmek için yakınlaştırın.", 67 | "map.info.teleport_command_copied": "Işınlama Komutu Kopyalandı", 68 | "map.tooltip.spawn": "Başlangıç Noktası", 69 | "map.setting.sealevel": "Deniz seviyesini göster", 70 | "map.setting.hillshade": "Kabartmaları Etkinleştir", 71 | "settings.world_preset.label": "Dünya Tipi:", 72 | "settings.dimension.label": "Boyut:", 73 | "settings.dimension.aria-label": "Boyut", 74 | "settings.seed.label": "Tohum:", 75 | "settings.seed.aria-label": "Tohum", 76 | "map.yslider.aria-label": "Yükseklik", 77 | "map.yslider.y-label": "Y: {y}", 78 | "settings.world_preset.aria-label": "Dünya Tipi", 79 | "minecraft.structure.minecraft.ocean_ruin_cold": "Soğuk Okyanus Harabesi", 80 | "minecraft.structure.minecraft.village_savanna": "Savan Köyü", 81 | "footer.legel.note": "BU RESMİ BİR MİNECRAFT ARACI DEĞİLDİR. MOJANG VEYA MİCROSOFT TARAFINDAN ONAYLANMAMIŞ VE BUNLARLA İLİŞKİLİ DEĞİLDİR.", 82 | "menu.reload_datapacks.title": "Paketleri Yeniden Yükle", 83 | "dropdown.add.built_in.title": "Yerleşik Veri Paketleri", 84 | "dropdown.add.recents.unavailable": "Bu tarayıcıda desteklenmiyor", 85 | "map.error.structures_unsupported": "Seçilen bazı yapılar desteklenmiyor! Üzgünüz." 86 | } 87 | -------------------------------------------------------------------------------- /locales/vi.json: -------------------------------------------------------------------------------- 1 | { 2 | "locale.local_name": "Tiếng Việt", 3 | "locale.minecraft_locale": "vi_vn", 4 | "locale.change_locale.title": "Thấy đổi thứ tiếng", 5 | "settings.mc_version.label": "Phiên bản:", 6 | "settings.mc_version.aria-label": "Phiên bản Minecraft", 7 | "settings.mc_version.mc1_19": "Minecraft 1.19.x", 8 | "settings.dev_mode.label": "Chế độ Nhà phát triển:", 9 | "settings.dev_mode.aria-label": "Chế độ Nhà phát triển", 10 | "settings.world_preset.label": "Cài đặt có sẵn của Thế giới:", 11 | "settings.world_preset.aria-label": "Cài đặt có sẵn của Thế giới", 12 | "settings.dimension.label": "Chiều không gian:", 13 | "settings.dimension.aria-label": "Chiều không gian", 14 | "settings.seed.label": "Số nguồn:", 15 | "settings.seed.aria-label": "Số nguồn", 16 | "settings.mc_version.mc1_20_2": "Minecraft 1.20.2", 17 | "settings.mc_version.mc1_21_5": "Minecraft 1.21.5", 18 | "minecraft.structure.minecraft.mansion": "Biệt Thự Trong Rừng", 19 | "minecraft.structure.minecraft.trial_chambers": "Trial Chambers", 20 | "footer.legel.note": "Không Phải Công Cụ Chính Thức Của MINECRAFT. Không Được Chấp Thuận Hoặc Liên Kế Với Mojang Hoặc Microsoft.", 21 | "settings.mc_version.mc1_20": "Minecraft 1.20 / 1.20.1", 22 | "settings.mc_version.mc1_20_4": "Minecraft 1.20.4", 23 | "settings.mc_version.mc1_20_6": "Minecraft 1.20.6", 24 | "settings.mc_version.mc1_21_1": "Minecraft 1.21.1", 25 | "settings.mc_version.mc1_21_3": "Minecraft 1.21.3", 26 | "settings.mc_version.mc1_21_4": "Minecraft 1.21.4", 27 | "settings.seed.randomize_button.title": "Tạo hạt giống ngẫu nhiên", 28 | "minecraft.dimension.minecraft.overworld": "Overworld", 29 | "minecraft.dimension.minecraft.the_end": "The End", 30 | "minecraft.dimension.minecraft.the_nether": "The Nether", 31 | "minecraft.structure.minecraft.bastion_remnant": "Pháo Đài Tàn Tích", 32 | "minecraft.structure.minecraft.ancient_city": "Thành Phố Cổ Đại", 33 | "minecraft.structure.minecraft.buried_treasure": "Kho Báu Bị Chôn Giấu", 34 | "footer.about": "Về Chúng Tôi", 35 | "footer.other": "Các Công Cụ Khác", 36 | "footer.licenses": "Bản Quyền", 37 | "footer.translate": "Chuyển Ngữ", 38 | "footer.sponsor": "Tài trợ", 39 | "footer.more": "thêm…", 40 | "datapack_list.remove_datapack.title": "Xóa Gói", 41 | "map.setting.graticule": "Hiển thị lưới khu vực", 42 | "tip_message.message": "Nếu bạn thấy Map có ích, Tôi rất mong nhận được đánh giá tốt!", 43 | "tip_message.kofi": "Mua Cafe cho Tôi", 44 | "tip_message.github": "Tài Trợ", 45 | "tip_message.close": "Bỏ Qua", 46 | "modrinth.search.aria-label": "Thanh tìm kiếm cho datapacks trên Modrinth", 47 | "modrinth.include-mods": "Bao gồm Mods", 48 | "modrinth.ignore-version": "bỏ qua phiên bản minecraft", 49 | "modrinth.ignore-version.aria-label": "bỏ qua phiên bản minecraft trong tìm kiếm", 50 | "modrinth.include-mods.aria-label": "Bao gồm các Mods trong tìm kiếm", 51 | "map.yslider.aria-label": "Tầng Y", 52 | "map.yslider.y-label": "Y:{y}", 53 | "map.setting.project": "Di chuyển đến địa điểm dưới bề mặt", 54 | "map.setting.sealevel": "Hiển thị mực nước biển", 55 | "map.setting.hillshade": "Bật Hillshading", 56 | "minecraft.structure.minecraft.desert_pyramid": "Kim Tự Tháp Sa Mạc", 57 | "minecraft.structure.minecraft.end_city": "End City", 58 | "minecraft.structure.minecraft.fortress": "Pháo Đài Nether", 59 | "minecraft.structure.minecraft.igloo": "Lều Tuyết", 60 | "minecraft.structure.minecraft.jungle_pyramid": "Đền Thờ Trong Rừng", 61 | "minecraft.structure.minecraft.ocean_ruin_cold": "Tàn Tích Vùng Biển Lạnh", 62 | "minecraft.structure.minecraft.ocean_ruin_warm": "Tàn Tích Vùng Biển Ấm", 63 | "minecraft.structure.minecraft.pillager_outpost": "Tiền Đồn Pillager", 64 | "minecraft.structure.minecraft.shipwreck": "Xác Tàu", 65 | "minecraft.structure.minecraft.shipwreck_beached": "Xác Tàu Trên Bờ Biển", 66 | "minecraft.structure.minecraft.stronghold": "Stronghold", 67 | "minecraft.structure.minecraft.swamp_hut": "Nhà Đầm Lầy", 68 | "minecraft.structure.minecraft.trail_ruins": "Di Tích Dân Làng", 69 | "minecraft.structure.minecraft.village_plains": "Làng Ở Đồng Bằng", 70 | "minecraft.structure.minecraft.village_desert": "Làng Ở Sa Mạc", 71 | "minecraft.structure.minecraft.village_savanna": "Làng Ở Thảo Nguyên", 72 | "minecraft.structure.minecraft.village_snowy": "Làng Ở Vùng Tuyết", 73 | "minecraft.structure.minecraft.village_taiga": "Làng Ở Taiga", 74 | "footer.view_source": "Xem Nguồn", 75 | "footer.report_issue": "Báo Cáo Vấn Đề", 76 | "footer.wiki": "Sổ Tay Tương Thích", 77 | "menu.add.title": "Thêm Gói", 78 | "menu.search_biome.title": "Tìm Biome", 79 | "menu.structure_positions.title": "Vị Trí Của Công Trình", 80 | "menu.reload_datapacks.title": "Tải Lại Gói", 81 | "dropdown.add.zip": "Mở Gói Hoặc Mod", 82 | "dropdown.add.picker.pack_and_mod": "Gói và Mod", 83 | "dropdown.add.picker.pack": "Gói (*.zip)", 84 | "dropdown.add.picker.mod": "Mods (*.jar)", 85 | "dropdown.add.folder": "Mở Thư Mục", 86 | "dropdown.add.modrinth": "Mở từ Modrinth", 87 | "dropdown.add.built_in.update_1_20": "Cập Nhật 1.20", 88 | "dropdown.add.built_in.update_1_21": "Cập Nhật 1.21", 89 | "dropdown.add.built_in.winter_drop": "Cập Nhật Mùa Đông", 90 | "dropdown.add.built_in.title": "Datapacks Tích Hợp Sẵn", 91 | "dropdown.add.recents.title": "Vừa Sử Dùng", 92 | "dropdown.add.recents.enable": "Bật", 93 | "dropdown.add.recents.enable.note": "(chấp nhận local storage)", 94 | "dropdown.add.recents.empty": "Đang Trống", 95 | "dropdown.add.recents.unavailable": "Không Hỗ Trợ Trình Duyệt Này", 96 | "dropdown.add.recents.not_found": "Không tìm thấy Gói. Đã bị xóa từ danh sách vừa sử dụng.", 97 | "dropdown.add.recents.type.zip": "zip file đã được lưu vào trình duyệt", 98 | "dropdown.add.recents.type.folder": "thư mục datapack được mở trực tiếp từ ổ đĩa", 99 | "dropdown.add.recents.type.modrinth": "phiên bản mới nhất từ modrinth", 100 | "dropdown.add.recents.wrong_version": "không khả dụng cho phiên bản này. ", 101 | "dropdown.search_biome.placeholder": "Tìm Biome", 102 | "dropdown.structure_positions.placeholder": "Tìm Công Trình", 103 | "modrinth.title": "Mở từ Modrinth", 104 | "modrinth.search.placeholder": "Tìm Kiếm Modrinth...", 105 | "modrinth.include-mods.notice": "Không phải tất cả Mods sẽ được hỗ trợ", 106 | "modrinth.ignore-version.notice": "Datapacks cho những phiên bản khác có thể hoạt động không muốn", 107 | "toggle_sidebar.title": "Bật/Tắt SideBar", 108 | "map.info.structures_hidden": "Một số công trình đang ẩn. Phóng to để nhìn.", 109 | "map.info.teleport_command_copied": "Đã Sao Chép Lệnh Dịch Chuyển", 110 | "map.error.structures_unsupported": "Một số công trình được lựa chọn không được hỗ trợ! Xin lỗi.", 111 | "map.tooltip.spawn": "Điểm Hồi Sinh" 112 | } 113 | -------------------------------------------------------------------------------- /locales/zh_CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "locale.local_name": "中文", 3 | "locale.minecraft_locale": "zh_cn", 4 | "locale.change_locale.title": "修改语言", 5 | "settings.mc_version.label": "版本:", 6 | "settings.mc_version.aria-label": "Minecraft 版本", 7 | "settings.mc_version.mc1_19": "Minecraft 1.19.x", 8 | "settings.mc_version.mc1_20": "Minecraft 1.20 / 1.20.1", 9 | "settings.mc_version.mc1_20_2": "Minecraft 1.20.2", 10 | "settings.mc_version.mc1_20_4": "Minecraft 1.20.4", 11 | "settings.world_preset.label": "世界类型:", 12 | "settings.world_preset.aria-label": "世界类型", 13 | "settings.dimension.label": "维度:", 14 | "settings.dimension.aria-label": "维度", 15 | "settings.seed.label": "世界种子:", 16 | "settings.seed.aria-label": "世界种子", 17 | "settings.seed.randomize_button.title": "随机种子", 18 | "footer.about": "关于", 19 | "footer.view_source": "查看源代码", 20 | "footer.report_issue": "反馈问题", 21 | "footer.other": "其他工具", 22 | "footer.licenses": "许可信息", 23 | "footer.sponsor": "赞助", 24 | "datapack_list.remove_datapack.title": "移除包", 25 | "menu.search_biome.title": "查找群系", 26 | "menu.structure_positions.title": "结构位置", 27 | "menu.reload_datapacks.title": "重载包", 28 | "dropdown.add.zip": "载入数据包或模组", 29 | "dropdown.add.folder": "打开文件夹", 30 | "dropdown.add.built_in.update_1_20": "更新至 1.20", 31 | "dropdown.add.built_in.title": "内置数据包", 32 | "dropdown.add.recents.title": "最近使用", 33 | "dropdown.add.recents.not_found": "找不到该数据包, 从列表中移除。", 34 | "dropdown.add.recents.enable": "启用", 35 | "dropdown.add.recents.enable.note": "(允许本地存储)", 36 | "dropdown.add.recents.empty": "空", 37 | "dropdown.add.recents.unavailable": "此浏览器不受支持", 38 | "dropdown.search_biome.placeholder": "查找群系", 39 | "dropdown.structure_positions.placeholder": "查找结构", 40 | "toggle_sidebar.title": "侧边栏开关", 41 | "map.info.structures_hidden": "部分结构被隐藏,请放大查看。", 42 | "map.info.teleport_command_copied": "传送命令已复制", 43 | "map.error.structures_unsupported": "抱歉,部分选中的结构无法显示。", 44 | "map.yslider.aria-label": "Y 轴", 45 | "map.yslider.y-label": "Y: {y}", 46 | "map.setting.project": "将坐标下移至地表", 47 | "map.setting.sealevel": "显示海平面", 48 | "map.setting.hillshade": "显示山体阴影", 49 | "dropdown.add.picker.pack_and_mod": "数据包与模组", 50 | "dropdown.add.picker.pack": "数据包(*.zip)", 51 | "dropdown.add.picker.mod": "模组(*.jar)", 52 | "footer.wiki": "兼容指南", 53 | "footer.legel.note": "非 MINECRAFT 官方工具。未经 MOJANG 或 MICROSOFT 批准,也不与 MOJANG 或 MICROSOFT 关联。", 54 | "footer.translate": "翻译", 55 | "minecraft.dimension.minecraft.overworld": "主世界", 56 | "minecraft.dimension.minecraft.the_end": "末地", 57 | "minecraft.dimension.minecraft.the_nether": "下界", 58 | "minecraft.structure.minecraft.ancient_city": "远古城市", 59 | "minecraft.structure.minecraft.bastion_remnant": "堡垒遗迹", 60 | "minecraft.structure.minecraft.buried_treasure": "埋藏的宝藏", 61 | "minecraft.structure.minecraft.desert_pyramid": "沙漠神殿", 62 | "minecraft.structure.minecraft.end_city": "末地城", 63 | "minecraft.structure.minecraft.fortress": "下界要塞", 64 | "minecraft.structure.minecraft.igloo": "雪屋", 65 | "minecraft.structure.minecraft.jungle_pyramid": "丛林神庙", 66 | "minecraft.structure.minecraft.mansion": "林地府邸", 67 | "minecraft.structure.minecraft.ocean_ruin_cold": "寒带海底废墟", 68 | "minecraft.structure.minecraft.ocean_ruin_warm": "热带海底废墟", 69 | "minecraft.structure.minecraft.pillager_outpost": "掠夺者前哨站", 70 | "minecraft.structure.minecraft.shipwreck": "沉船", 71 | "minecraft.structure.minecraft.shipwreck_beached": "沙滩沉船", 72 | "minecraft.structure.minecraft.stronghold": "要塞", 73 | "minecraft.structure.minecraft.swamp_hut": "沼泽小屋", 74 | "minecraft.structure.minecraft.trail_ruins": "古迹废墟", 75 | "minecraft.structure.minecraft.village_desert": "沙漠村庄", 76 | "minecraft.structure.minecraft.village_plains": "平原村庄", 77 | "minecraft.structure.minecraft.village_savanna": "热带草原村庄", 78 | "minecraft.structure.minecraft.village_snowy": "雪原村庄", 79 | "minecraft.structure.minecraft.village_taiga": "针叶林村庄", 80 | "menu.add.title": "载入数据包", 81 | "settings.dev_mode.label": "开发者模式:", 82 | "settings.dev_mode.aria-label": "开发者模式", 83 | "map.tooltip.spawn": "出生点", 84 | "dropdown.add.built_in.update_1_21": "更新至 1.21", 85 | "footer.more": "更多…", 86 | "settings.mc_version.mc1_20_6": "Minecraft 1.20.6", 87 | "minecraft.structure.minecraft.trial_chambers": "试炼密室", 88 | "settings.mc_version.mc1_21_1": "Minecraft 1.21.1", 89 | "settings.mc_version.mc1_21_3": "Minecraft 1.21.3", 90 | "dropdown.add.modrinth": "从Modrinth中打开", 91 | "settings.mc_version.mc1_21_4": "Minecraft 1.21.4", 92 | "tip_message.message": "如果您认为这个地图有用,请支持我们!", 93 | "tip_message.github": "发起人", 94 | "tip_message.close": "关闭", 95 | "map.setting.graticule": "显示区域网格", 96 | "dropdown.add.recents.type.zip": "ZIP文件已在浏览器中保存", 97 | "dropdown.add.recents.type.folder": "直接从磁盘中打开的数据包文件夹", 98 | "modrinth.ignore-version": "忽略Minecraft版本", 99 | "modrinth.ignore-version.notice": "其他版本的数据包可能不按预期工作", 100 | "dropdown.add.recents.type.modrinth": "Modrinth上最新的版本", 101 | "modrinth.title": "从Modrinth打开", 102 | "modrinth.search.placeholder": "在Modrinth搜索…", 103 | "dropdown.add.built_in.winter_drop": "苍园觉醒", 104 | "tip_message.kofi": "请我喝杯咖啡", 105 | "dropdown.add.recents.wrong_version": "在此版本不可用 ", 106 | "modrinth.search.aria-label": "Modrinth上的数据包搜索栏", 107 | "modrinth.include-mods": "包含的mods", 108 | "modrinth.include-mods.aria-label": "搜索时包含的mods", 109 | "settings.mc_version.mc1_21_5": "Minecraft 1.21.5", 110 | "modrinth.ignore-version.aria-label": "在搜索时忽略Minecraft版本", 111 | "modrinth.include-mods.notice": "并非所有mods都受此地图支持" 112 | } 113 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "datapack-map", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite --force --host", 8 | "createZips": "python scripts/createVanillaZips.py", 9 | "build": "vue-tsc && vite build", 10 | "preview": "vite preview --host" 11 | }, 12 | "dependencies": { 13 | "@fortawesome/fontawesome-svg-core": "^6.4.0", 14 | "@fortawesome/free-solid-svg-icons": "^6.4.0", 15 | "@fortawesome/vue-fontawesome": "^3.0.3", 16 | "@vueuse/components": "^10.2.0", 17 | "deepslate": "^0.23.4", 18 | "idb-keyval": "^6.2.1", 19 | "leaflet": "^1.9.4", 20 | "mc-datapack-loader": "0.5.1", 21 | "pinia": "^2.1.4", 22 | "vue": "^3.3.4", 23 | "vue-i18n": "^9.2.2", 24 | "vue-slider-component": "^4.1.0-beta.7" 25 | }, 26 | "devDependencies": { 27 | "@intlify/unplugin-vue-i18n": "^0.11.0", 28 | "@types/leaflet": "^1.9.3", 29 | "@types/node": "^20.3.1", 30 | "@types/wicg-file-system-access": "^2020.9.6", 31 | "@vitejs/plugin-vue": "^4.2.3", 32 | "typescript": "^5.1.3", 33 | "vite": "^4.3.9", 34 | "vite-plugin-pwa": "^0.16.4", 35 | "vue-tsc": "^1.8.1" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /public/CNAME: -------------------------------------------------------------------------------- 1 | map.jacobsjo.eu -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobsjo/mc-datapack-map/86d8f729324912092b64778907ad0c32f440e961/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobsjo/mc-datapack-map/86d8f729324912092b64778907ad0c32f440e961/public/favicon-192x192.png -------------------------------------------------------------------------------- /public/favicon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobsjo/mc-datapack-map/86d8f729324912092b64778907ad0c32f440e961/public/favicon-512x512.png -------------------------------------------------------------------------------- /public/favicon-maskable.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 39 | 41 | 44 | 48 | 49 | 50 | 56 | 60 | 65 | 70 | 75 | 80 | 84 | 89 | 93 | 94 | 99 | 103 | 104 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /public/favicon-monochrome.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 39 | 41 | 44 | 48 | 49 | 50 | 54 | 59 | 63 | 68 | 72 | 73 | 78 | 82 | 83 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 39 | 41 | 44 | 48 | 49 | 50 | 54 | 59 | 64 | 69 | 73 | 78 | 82 | 83 | 88 | 92 | 93 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobsjo/mc-datapack-map/86d8f729324912092b64778907ad0c32f440e961/public/icon.png -------------------------------------------------------------------------------- /public/images/modrinth.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/images/spawn_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobsjo/mc-datapack-map/86d8f729324912092b64778907ad0c32f440e961/public/images/spawn_icon.png -------------------------------------------------------------------------------- /public/images/wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobsjo/mc-datapack-map/86d8f729324912092b64778907ad0c32f440e961/public/images/wave.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / -------------------------------------------------------------------------------- /public/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobsjo/mc-datapack-map/86d8f729324912092b64778907ad0c32f440e961/public/shadow.png -------------------------------------------------------------------------------- /scripts/createVanillaZips.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import zipfile 3 | import io 4 | from pathlib import Path 5 | import shutil 6 | from shutil import copytree 7 | 8 | TMP_PATH = "/tmp/jacobsjo/createVanillaZips/" 9 | DATAPACK_PATH = TMP_PATH + "data/minecraft/datapacks/" 10 | 11 | REQUIRED_STRUCTURE_TEMPLATES = [ 12 | "ancient_city/city_center/city_center_", 13 | "bastion/units/air_base", 14 | "bastion/hoglin_stable/air_base", 15 | "bastion/treasure/big_air_full", 16 | "bastion/bridge/starting_pieces/entrance_base", 17 | "pillager_outpost/base_plate", 18 | "trail_ruins/tower/tower_", 19 | "village/plains/town_centers/", 20 | "village/desert/town_centers/", 21 | "village/savanna/town_centers/", 22 | "village/snowy/town_centers/", 23 | "village/taiga/town_centers/", 24 | "village/plains/zombie/town_centers/", 25 | "village/desert/zombie/town_centers/", 26 | "village/savanna/zombie/town_centers/", 27 | "village/snowy/zombie/town_centers/", 28 | "village/taiga/zombie/town_centers/", 29 | "trial_chambers/corridor/end", 30 | ] 31 | 32 | REQUIRED_DATA_TYPES = [ 33 | "worldgen/world_preset", 34 | "worldgen/density_function", 35 | "worldgen/noise", 36 | "worldgen/noise_settings", 37 | "worldgen/biome", 38 | "worldgen/structure", 39 | "worldgen/structure_set", 40 | "worldgen/template_pool", 41 | "worldgen/multi_noise_biome_source_parameter_list", 42 | "dimension_type", 43 | "tags/worldgen/world_preset", 44 | "tags/worldgen/biome", 45 | "tags/worldgen/structure", 46 | ] 47 | 48 | for path in REQUIRED_STRUCTURE_TEMPLATES: 49 | REQUIRED_DATA_TYPES.append(f'structures/{path}') 50 | REQUIRED_DATA_TYPES.append(f'structure/{path}') 51 | 52 | REQUIRED_ASSETS_TYPES = [ 53 | "lang/de_de", 54 | "lang/en_us", 55 | "lang/fr_fr", 56 | "lang/pt_br", 57 | "lang/ru_ru", 58 | "lang/zh_cn", 59 | "lang/tr_tr", 60 | "lang/ja_jp", 61 | "lang/vi_vn", 62 | "lang/th_th" 63 | ] 64 | 65 | REQUIRED_PATHS = [ 66 | "pack.mcmeta", 67 | "data/minecraft/datapacks/update_1_20/pack.mcmeta", 68 | "data/minecraft/datapacks/update_1_21/pack.mcmeta", 69 | "data/minecraft/datapacks/winter_drop/pack.mcmeta" 70 | ] 71 | 72 | for path in REQUIRED_DATA_TYPES: 73 | REQUIRED_PATHS.append(f'data/minecraft/{path}') 74 | REQUIRED_PATHS.append(f'data/minecraft/datapacks/update_1_20/data/minecraft/{path}') 75 | REQUIRED_PATHS.append(f'data/minecraft/datapacks/update_1_21/data/minecraft/{path}') 76 | REQUIRED_PATHS.append(f'data/minecraft/datapacks/winter_drop/data/minecraft/{path}') 77 | 78 | for path in REQUIRED_ASSETS_TYPES: 79 | REQUIRED_PATHS.append("assets/minecraft/" + path) 80 | 81 | def download_and_extract(url: str): 82 | with zipfile.ZipFile(io.BytesIO(requests.get(url).content)) as jar: 83 | for file in jar.infolist(): 84 | file.filename = file.filename.split('/', 1)[1] 85 | for path in REQUIRED_PATHS: 86 | if (file.filename.startswith(path)): 87 | jar.extract(file, TMP_PATH) 88 | 89 | 90 | def main(version: str, include_datapack: str = "", suffix: str = ""): 91 | # empty temp folder 92 | print("Emptying temp folder") 93 | emptyTmp() 94 | 95 | # get client jar 96 | print("Getting client data") 97 | download_and_extract(f'https://github.com/misode/mcmeta/archive/refs/{version}assets-json.zip') 98 | download_and_extract(f'https://github.com/misode/mcmeta/archive/refs/{version}data.zip') 99 | 100 | # add datapack base 101 | print("Copying base files") 102 | copytree("vanilla_datapack_base/", TMP_PATH, dirs_exist_ok=True) 103 | 104 | # zip back up 105 | print("Creating zip files") 106 | if include_datapack != "": 107 | shutil.make_archive("public/vanilla_datapacks/vanilla" + suffix + "_" + include_datapack, 'zip', DATAPACK_PATH + include_datapack + "/") 108 | shutil.rmtree(DATAPACK_PATH + include_datapack + "/") 109 | 110 | shutil.make_archive("public/vanilla_datapacks/vanilla" + suffix, 'zip', TMP_PATH) 111 | 112 | print("Done!") 113 | 114 | def emptyTmp(): 115 | tmppath = Path(TMP_PATH) 116 | if (tmppath.exists() and tmppath.is_dir()): 117 | shutil.rmtree(tmppath) 118 | 119 | 120 | if __name__ == "__main__": 121 | main('tags/1.19.4-', "update_1_20", "_1_19") 122 | main('tags/1.20.1-', "", "_1_20") 123 | main('tags/1.20.2-', "", "_1_20_2") 124 | main('tags/1.20.4-', "update_1_21", "_1_20_4") 125 | main('tags/1.20.6-', "update_1_21", "_1_20_6") 126 | main('tags/1.21-', "", "_1_21") 127 | main('tags/1.21.3-', "winter_drop", "_1_21_3") 128 | main('tags/1.21.4-', "", "_1_21_4") 129 | main('tags/1.21.5-', "", "_1_21_5") 130 | 131 | -------------------------------------------------------------------------------- /scripts/requirements.txt: -------------------------------------------------------------------------------- 1 | requests==2.28.2 -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 35 | 36 | 54 | -------------------------------------------------------------------------------- /src/MapLayers/Graticule.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Partially copied from https://github.com/ablakey/Leaflet.SimpleGraticule and https://github.com/FacilMap/Leaflet.AutoGraticule/tree/main 3 | * Copyright (c) 2014-2015, Andrew Blakey 4 | * Copyright (c) 2020, Candid Dauth 5 | * BSD-2-Clause license 6 | */ 7 | 8 | import * as L from "leaflet" 9 | 10 | import { LatLngBounds, LayerGroup, LayerOptions, Map, Point, Util } from "leaflet"; 11 | 12 | export interface GraticuleOptions extends LayerOptions { 13 | distance: (zoom: number) => number 14 | } 15 | 16 | 17 | export class Graticule extends LayerGroup { 18 | 19 | options: GraticuleOptions = { 20 | distance: () => 512 21 | } 22 | 23 | lineStyle = { 24 | stroke: true, 25 | color: '#111', 26 | opacity: 0.6, 27 | weight: 1, 28 | interactive: false, 29 | clickable: false //legacy support 30 | } 31 | 32 | _bounds!: LatLngBounds; 33 | 34 | constructor(options?: Partial) { 35 | super() 36 | Util.setOptions(this, options) 37 | } 38 | 39 | onAdd(map: Map): this { 40 | this._map = map 41 | this.redraw() 42 | this._map.on("viewreset", this.redraw, this) 43 | this._map.on("moveend", this.redraw, this) 44 | 45 | this.eachLayer(this._map.addLayer, this._map) 46 | 47 | return this 48 | } 49 | 50 | onRemove(map: Map): this { 51 | map.off("viewreset", this.redraw, this) 52 | map.off("moveend", this.redraw, this) 53 | 54 | this.eachLayer(this._map.removeLayer, this._map) 55 | 56 | return this; 57 | } 58 | 59 | redraw() { 60 | this._bounds = this._map.getBounds().pad(0.5); 61 | this.clearLayers(); 62 | this.constructLines(); 63 | 64 | return this 65 | } 66 | 67 | constructLines() { 68 | var crs = this._map.options.crs! 69 | var distance = this.options.distance(this._map.getZoom()) 70 | var nw = crs.project(this._bounds.getNorthWest()) 71 | var se = crs.project(this._bounds.getSouthEast()) 72 | var x_line_count = Math.ceil((se.x - nw.x) / distance) 73 | var z_line_count = Math.ceil((nw.y - se.y) / distance) 74 | var x_line_min = Math.floor(nw.x / distance) * distance 75 | var z_line_min = Math.floor(se.y / distance) * distance 76 | 77 | var lines = new Array(x_line_count + z_line_count) 78 | 79 | for (var i = 0 ; i <= x_line_count ; i++){ 80 | var x = x_line_min + i * distance 81 | lines[i] = new L.Polyline([ 82 | crs.unproject(new Point(x, nw.y)), 83 | crs.unproject(new Point(x, se.y)), 84 | ], this.lineStyle) 85 | } 86 | 87 | for (var i = 0 ; i <= z_line_count ; i++){ 88 | var z = z_line_min + i * distance 89 | lines[i + x_line_count] = new L.Polyline([ 90 | crs.unproject(new Point(nw.x, z)), 91 | crs.unproject(new Point(se.x, z)), 92 | ], this.lineStyle) 93 | } 94 | 95 | lines.forEach(this.addLayer, this); 96 | } 97 | } -------------------------------------------------------------------------------- /src/assets/kofi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 43 | 45 | 46 | 48 | image/svg+xml 49 | 51 | 52 | 53 | 54 | 55 | 60 | 63 | 65 | 71 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /src/components/BiomeTooltip.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 26 | 27 | 55 | -------------------------------------------------------------------------------- /src/components/Collapsable.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/DatapackEntry.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 36 | 37 | 97 | -------------------------------------------------------------------------------- /src/components/DatapackList.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | 17 | 27 | -------------------------------------------------------------------------------- /src/components/Faq.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/Footer.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 28 | 29 | -------------------------------------------------------------------------------- /src/components/LocaleChanger.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 34 | 35 | -------------------------------------------------------------------------------- /src/components/MapButton.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 33 | 34 | 69 | 70 | -------------------------------------------------------------------------------- /src/components/MenuButtons.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 115 | 116 | 190 | -------------------------------------------------------------------------------- /src/components/MinecraftText.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 34 | 35 | -------------------------------------------------------------------------------- /src/components/Popup.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 43 | 44 | -------------------------------------------------------------------------------- /src/components/SettingsPanel.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 59 | 60 | 113 | -------------------------------------------------------------------------------- /src/components/Sidebar.vue: -------------------------------------------------------------------------------- 1 | 69 | 70 | 87 | 88 | 117 | -------------------------------------------------------------------------------- /src/components/TipMessage.vue: -------------------------------------------------------------------------------- 1 | 3 | 4 | 22 | 23 | -------------------------------------------------------------------------------- /src/components/YSlider.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 35 | 36 | -------------------------------------------------------------------------------- /src/components/dropdown/Dropdown.vue: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/dropdown/DropdownEntry.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | 19 | -------------------------------------------------------------------------------- /src/components/dropdown/DropdownIconEntry.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | 20 | -------------------------------------------------------------------------------- /src/components/dropdown/DropdownRecentsEntry.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 29 | 30 | -------------------------------------------------------------------------------- /src/components/dropdown/FindBiomeDropdown.vue: -------------------------------------------------------------------------------- 1 | 2 | 35 | 36 | 37 | 40 | 41 | -------------------------------------------------------------------------------- /src/components/dropdown/ListDropdown.vue: -------------------------------------------------------------------------------- 1 | 2 | 40 | 41 | 42 | 60 | 61 | -------------------------------------------------------------------------------- /src/components/dropdown/ListDropdownEntry.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 36 | 37 | -------------------------------------------------------------------------------- /src/components/dropdown/ListDropdownGroup.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 58 | 59 | -------------------------------------------------------------------------------- /src/components/dropdown/StructureDropdown.vue: -------------------------------------------------------------------------------- 1 | 2 | 29 | 30 | 33 | 34 | -------------------------------------------------------------------------------- /src/components/modrinth/ModrinthEntry.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | 22 | -------------------------------------------------------------------------------- /src/components/modrinth/ModrinthMenu.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 72 | 73 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import { createI18n } from 'vue-i18n' 3 | import { createPinia } from 'pinia' 4 | import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; 5 | import { library } from "@fortawesome/fontawesome-svg-core"; 6 | import { faFileZipper, faFolderOpen, faXmark, faRotateRight, faPlus, faBars, faMagnifyingGlass, faToggleOn, faToggleOff, faLocationDot, faAngleRight, faAngleDown, faDice, faGlobe, faEarthEurope, faMountainSun, faWater, faArrowsDownToLine, faTableCells, faCircleQuestion } from "@fortawesome/free-solid-svg-icons"; 7 | import './style.css' 8 | import App from './App.vue' 9 | 10 | import messages from '@intlify/unplugin-vue-i18n/messages' 11 | 12 | import { registerSW } from 'virtual:pwa-register' 13 | 14 | registerSW({ immediate: true }) 15 | 16 | library.add(faFileZipper, faFolderOpen, faXmark, faRotateRight, faPlus, faBars, faMagnifyingGlass, faToggleOn, faToggleOff, faLocationDot, faAngleRight, faAngleDown, faDice, faGlobe, faEarthEurope, faMountainSun, faWater, faArrowsDownToLine, faTableCells, faCircleQuestion); 17 | 18 | 19 | const uri = window.location.search.substring(1) 20 | const params = new URLSearchParams(uri) 21 | var lang = params.get('lang') ?? 'en' 22 | if (messages[lang] === undefined){ 23 | lang = 'en' 24 | params.set('lang', 'en') 25 | window.location.search = params.toString() 26 | } 27 | 28 | const i18n = createI18n({ 29 | globalInjection: true, 30 | locale: lang, 31 | fallbackLocale: 'en', 32 | messages: messages, 33 | missingWarn: false, 34 | fallbackWarn: false, 35 | }) 36 | 37 | const pinia = createPinia() 38 | 39 | const app = createApp(App) 40 | app.use(pinia) 41 | app.use(i18n) 42 | app.component("font-awesome-icon", FontAwesomeIcon) 43 | app.config.globalProperties.window = window 44 | app.mount('#app') -------------------------------------------------------------------------------- /src/stores/useBiomeSearchStore.ts: -------------------------------------------------------------------------------- 1 | import { Identifier, StructurePlacement, StructureSet, WorldgenStructure } from "deepslate"; 2 | import { defineStore } from "pinia"; 3 | import { computed, reactive, ref } from "vue"; 4 | 5 | 6 | export const useSearchStore = defineStore('search', () => { 7 | const biomes = reactive>(new Set()) 8 | const structures = reactive>(new Set()) 9 | 10 | const disabled = ref(false) 11 | 12 | const structure_sets = computed(() => { 13 | structures.size // make sure any change to structures triggers recomputation 14 | const sets: Identifier[] = [] 15 | 16 | var has_invalid_set = false 17 | for (const id of StructureSet.REGISTRY.keys()){ 18 | const set = StructureSet.REGISTRY.get(id) 19 | if (!set) continue 20 | 21 | var set_needed = false 22 | var set_invalid = false 23 | 24 | for (const entry of set?.structures){ 25 | if (structures.has(entry.structure.key()?.toString() ?? "<>")){ 26 | set_needed = true 27 | const s = entry.structure.value() 28 | if (s instanceof WorldgenStructure.MineshaftStructure || s instanceof WorldgenStructure.NetherFossilStructure || s instanceof WorldgenStructure.OceanMonumentStructure || s instanceof WorldgenStructure.RuinedPortalStructure){ 29 | set_invalid = true 30 | } 31 | } 32 | } 33 | if (set_needed){ 34 | if (set_invalid){ 35 | has_invalid_set = true 36 | } else { 37 | sets.push(id) 38 | } 39 | } 40 | } 41 | return {sets, has_invalid: has_invalid_set} 42 | }) 43 | 44 | return {biomes, structures, structure_sets, disabled} 45 | }) 46 | -------------------------------------------------------------------------------- /src/stores/useDatapackStore.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from "pinia"; 2 | 3 | import { AnonymousDatapack, Datapack, DatapackList, ResourceLocation } from "mc-datapack-loader" 4 | import { computed, onMounted, reactive, ref, watch } from "vue"; 5 | import { DensityFunction, Holder, HolderSet, Identifier, NoiseParameters, StructureSet, WorldgenRegistries, WorldgenStructure, StructureTemplatePool, Structure, NbtFile, Registry, Json } from "deepslate"; 6 | import { useSettingsStore } from "./useSettingsStore"; 7 | import { updateUrlParam, versionMetadata } from "../util"; 8 | import { useI18n } from "vue-i18n"; 9 | 10 | 11 | export const useDatapackStore = defineStore('datapacks', () => { 12 | const uri = window.location.search.substring(1) 13 | const datapacksParam = new URLSearchParams(uri).get('datapacks')?.split(',') 14 | 15 | const i18n = useI18n() 16 | const settingsStore = useSettingsStore() 17 | 18 | const metadata = versionMetadata[settingsStore.mc_version]; 19 | const vanillaDatapack = Datapack.fromZipUrl(`./vanilla_datapacks/vanilla_${metadata.vanillaDatapack}.zip`, metadata.datapackFormat) 20 | 21 | let last_key = 0 22 | 23 | const ds: {datapack: Datapack, key: number, id?: string}[] = [{ datapack: vanillaDatapack, key: 0 }] 24 | 25 | if (datapacksParam !== undefined) { 26 | for (const id of datapacksParam){ 27 | const promise = getDatapackFromId(id) 28 | if (promise === undefined) continue 29 | ds.push({datapack: promise, key: ++last_key, id: id}) 30 | } 31 | } 32 | 33 | const datapacks = reactive<{datapack: Datapack, key: number, id?: string}[]>(ds) 34 | 35 | var last_version = settingsStore.mc_version 36 | settingsStore.$subscribe(async () => { 37 | if (last_version === settingsStore.mc_version) 38 | return 39 | 40 | const metadata = versionMetadata[settingsStore.mc_version]; 41 | const vanillaDatapack = Datapack.fromZipUrl(`./vanilla_datapacks/vanilla_${metadata.vanillaDatapack}.zip`, metadata.datapackFormat) 42 | datapacks[0].datapack = vanillaDatapack 43 | datapacks[0].key = ++last_key 44 | 45 | for (var i = 1; i < datapacks.length ; i++){ 46 | datapacks[i].datapack.setPackVersion(metadata.datapackFormat) 47 | } 48 | 49 | last_version = settingsStore.mc_version 50 | }) 51 | 52 | watch(datapacks, (new_datapacks) => { 53 | const ids = new_datapacks.flatMap(d => d.id ? [d.id] : []) 54 | updateUrlParam('datapacks', ids.length > 0 ? ids.join(',') : undefined) 55 | }) 56 | 57 | const composite_datapack = Datapack.compose(new class implements DatapackList{ 58 | async getDatapacks(): Promise { 59 | return datapacks.map(d => d.datapack) 60 | } 61 | }) 62 | 63 | const dimensions = computed(async () => { 64 | const world_preset_json = await composite_datapack.get(ResourceLocation.WORLDGEN_WORLD_PRESET, settingsStore.world_preset) as { dimensions: { [key: string]: unknown } } 65 | return (await composite_datapack.getIds(ResourceLocation.DIMENSION)).concat(Object.keys(world_preset_json.dimensions).map(i => Identifier.parse(i))).filter((value, index, self) => 66 | index === self.findIndex((t) => ( 67 | t.equals(value) 68 | )) 69 | ) 70 | }) 71 | 72 | const world_presets = computed(async () => { 73 | // TODO use deepslate HolderSet 74 | const normal_world_preset_tag = await composite_datapack.get(ResourceLocation.WORLDGEN_WORLD_PRESET_TAG, Identifier.create("normal")) as { values: string[] } 75 | return normal_world_preset_tag.values.map(id => Identifier.parse(id)) 76 | }) 77 | 78 | const registered = computed(reloadDatapack) 79 | 80 | async function registerType(location: ResourceLocation, registry: Registry, loader: (json: any, id: Identifier) => (T | (() => T))): Promise{ 81 | registry.clear() 82 | await Promise.all((await composite_datapack.getIds(location)).map(id => new Promise(async (resolve) => { 83 | try { 84 | const data = await composite_datapack.get(location, id) 85 | try { 86 | registry.register(id, loader(data, id)) 87 | } catch (e) { 88 | console.warn(`Failed to register ${location.location}: ${id.toString()}: ${e}`) 89 | } 90 | } catch (e) { 91 | console.warn(`Failed to load ${location.location}: ${id.toString()}: ${e}`) 92 | } 93 | resolve() 94 | }))) 95 | } 96 | 97 | async function registerTag(location: ResourceLocation, registry: Registry){ 98 | await registerType(location, registry.getTagRegistry(), (json, id) => HolderSet.fromJson(registry, json, id)) 99 | } 100 | 101 | async function reloadDatapack() { 102 | const promises: Promise[] = [] 103 | promises.push(registerType(ResourceLocation.WORLDGEN_DENSITY_FUNCTION, WorldgenRegistries.DENSITY_FUNCTION, (json) => new DensityFunction.HolderHolder(Holder.parser(WorldgenRegistries.DENSITY_FUNCTION, DensityFunction.fromJson)(json)))) 104 | promises.push(registerType(ResourceLocation.WORLDGEN_NOISE, WorldgenRegistries.NOISE, NoiseParameters.fromJson)) 105 | promises.push(registerType(ResourceLocation.WORLDGEN_STRUCTURE_SET, StructureSet.REGISTRY, StructureSet.fromJson)) 106 | promises.push(registerType(ResourceLocation.WORLDGEN_TEMPLATE_POOL, StructureTemplatePool.REGISTRY, StructureTemplatePool.fromJson)) 107 | promises.push(registerType(versionMetadata[settingsStore.mc_version].resourceLocations.structure, Structure.REGISTRY, (arrayBuffer) => () => Structure.fromNbt(NbtFile.read(new Uint8Array(arrayBuffer)).root))) 108 | promises.push(new Promise(async (resolve) => { 109 | await registerType(ResourceLocation.WORLDGEN_BIOME, WorldgenRegistries.BIOME, () => {return {}}) 110 | await registerTag(ResourceLocation.WORLDGEN_BIOME_TAG, WorldgenRegistries.BIOME) 111 | await registerType(ResourceLocation.WORLDGEN_STRUCTURE, WorldgenStructure.REGISTRY, worldgenStructureFromJson) 112 | await registerTag(ResourceLocation.WORLDGEN_STRUCTURE_TAG, WorldgenStructure.REGISTRY) 113 | resolve() 114 | })) 115 | await Promise.all(promises) 116 | } 117 | 118 | function worldgenStructureFromJson(obj: unknown){ 119 | const root = Json.readObject(obj) ?? {} 120 | if (!versionMetadata[settingsStore.mc_version].dimensionPaddingEnabled){ 121 | delete root.dimension_padding 122 | } 123 | return WorldgenStructure.fromJson(obj) 124 | } 125 | 126 | function addDatapack(datapack: Datapack) { 127 | datapacks.push({ datapack: datapack, key: ++last_key }) 128 | } 129 | 130 | async function removeDatapack(id: number) { 131 | datapacks.splice(id, 1) 132 | } 133 | 134 | function getDatapackFromId(id: string) { 135 | const [namespace, slug] = id.split(':', 2) 136 | if (namespace === "modrinth"){ 137 | return Datapack.fromZipUrl(getModrinthUrl(slug), versionMetadata[settingsStore.mc_version].datapackFormat) 138 | } 139 | } 140 | 141 | async function addModrinthDatapack(slug: string){ 142 | const url = await getModrinthUrl(slug) 143 | const datapack = Datapack.fromZipUrl(url, versionMetadata[settingsStore.mc_version].datapackFormat) 144 | datapacks.push({ datapack: datapack, key: ++last_key, id: `modrinth:${slug}` }) 145 | return datapack 146 | } 147 | 148 | 149 | async function getModrinthUrl(slug: string): Promise{ 150 | async function tryFetch(url: string ){ 151 | const response = await (await fetch(url)).json().catch(() => {throw new Error('datapack not found')}) 152 | if (!Array.isArray(response) || response.length === 0) return undefined 153 | return response 154 | } 155 | 156 | const versionsResponse = await tryFetch(`https://api.modrinth.com/v2/project/${slug}/version`) 157 | 158 | if (versionsResponse === undefined){ 159 | throw new Error(`Modrinth project ${slug} not found`) 160 | } 161 | 162 | const version 163 | = versionsResponse.find(v => v.loaders.includes('datapack') && v.game_versions.some((mc_version: string) => (versionMetadata[settingsStore.mc_version].canonicalNames.includes(mc_version)))) // Datapack of correct version 164 | ?? versionsResponse.find(v => v.loaders.includes('datapack')) // Datapack of any version 165 | ?? versionsResponse.find(v => v.game_versions.some((mc_version: string) => (versionMetadata[settingsStore.mc_version].canonicalNames.includes(mc_version)))) // Mod of correct version 166 | ?? versionsResponse[0] // Mod of any version 167 | 168 | const fileInfo = version.files.find((file: any) => file.primary) 169 | 170 | if (fileInfo.size > 2e+9) { 171 | throw new Error("File larger than 2 GB, not downloading") 172 | } 173 | 174 | if (!((fileInfo.filename as string).endsWith('.zip') || (fileInfo.filename as string).endsWith('.jar'))) { 175 | throw new Error("File is not a .zip or .jar file") 176 | } 177 | 178 | return fileInfo.url 179 | } 180 | 181 | return { datapacks, composite_datapack, registered, reloadDatapack, addDatapack, removeDatapack, dimensions, world_presets, addModrinthDatapack } 182 | }) -------------------------------------------------------------------------------- /src/stores/useRecentStore.ts: -------------------------------------------------------------------------------- 1 | import { Json } from "deepslate"; 2 | import { Datapack } from "mc-datapack-loader"; 3 | import { defineStore } from "pinia"; 4 | import { ref } from "vue"; 5 | import { get, set } from 'idb-keyval' 6 | import { TextComponent } from "../util/TextComponent"; 7 | 8 | 9 | export type StoredDatapack = { img: string, text: string, fileHandle?: FileSystemHandle, storedInOpfs?: boolean, modrinthSlug?: string } 10 | 11 | export const useRecentStore = defineStore('recents', () => { 12 | 13 | const avalible = "showDirectoryPicker" in window || 'storage' in navigator 14 | const enabled = ref(false) 15 | const recents = ref([]) 16 | 17 | get('recent-datapacks-meta').then((metas: StoredDatapack[]) => { 18 | if (metas) { 19 | get('recent-datapacks-handle').then(h => { 20 | for (var i = 0 ; i < metas.length ; i++){ 21 | metas[i].fileHandle = h[i] 22 | } 23 | recents.value = metas 24 | enabled.value = true 25 | }) 26 | } 27 | }) 28 | 29 | 30 | function enable() { 31 | enabled.value = true 32 | set('recent-datapacks-meta', []) 33 | set('recent-datapacks-handle', []) 34 | } 35 | 36 | async function storeAndAddRecent(file: File, datapack: Datapack) { 37 | const opfsRoot = await navigator.storage.getDirectory() 38 | const fileHandle = await opfsRoot.getFileHandle(file.name, {create: true}) 39 | const writable = await fileHandle.createWritable() 40 | await writable.write(file) 41 | await writable.close() 42 | addRecentFileHandle(fileHandle, datapack, true) 43 | } 44 | 45 | async function addRecentFileHandle(fileHandle: FileSystemHandle, datapack: Datapack, storedInOpfs: boolean = false) { 46 | if (!enabled.value){ 47 | return 48 | } 49 | 50 | const old_id = recents.value.findIndex(r => r.fileHandle?.name === fileHandle.name) 51 | if (old_id >= 0) { 52 | recents.value.splice(old_id, 1) 53 | } 54 | 55 | const mcmeta = Json.readObject((await datapack.getMcmeta())) ?? {} 56 | const pack = Json.readObject(mcmeta.pack) ?? {} 57 | 58 | addRecent({ 59 | img: await datapack.getImage(), 60 | text: TextComponent.parse(pack.description).toString().split('\n')[0], 61 | fileHandle: fileHandle, 62 | storedInOpfs 63 | }) 64 | } 65 | 66 | async function addRecentModrinth(datapack: Datapack, slug: string, title: string) { 67 | if (!enabled.value){ 68 | return 69 | } 70 | 71 | const old_id = recents.value.findIndex(r => r.modrinthSlug === slug) 72 | if (old_id >= 0) { 73 | recents.value.splice(old_id, 1) 74 | } 75 | 76 | addRecent({ 77 | img: await datapack.getImage(), 78 | text: title, 79 | modrinthSlug: slug 80 | }) 81 | } 82 | 83 | function addRecent(stored: StoredDatapack) { 84 | if (recents.value.length >= 10) { 85 | recents.value.pop() 86 | } 87 | 88 | recents.value.unshift(stored) 89 | 90 | set('recent-datapacks-meta', recents.value.map(v => { 91 | return {img: v.img, text: v.text, storedInOpfs: v.storedInOpfs, modrinthSlug: v.modrinthSlug} 92 | })) 93 | 94 | set('recent-datapacks-handle', recents.value.map(v => { 95 | return v.fileHandle 96 | })) 97 | 98 | } 99 | 100 | 101 | function removeRecentFileHandle(name: string){ 102 | const recent = recents.value.findIndex(r => r.fileHandle?.name === name) 103 | if (recent >= 0){ 104 | recents.value.splice(recent, 1) 105 | } 106 | } 107 | 108 | return { avalible, enabled, recents, enable, addRecentFileHandle, storeAndAddRecent, removeRecentFileHandle, addRecentModrinth } 109 | }) -------------------------------------------------------------------------------- /src/stores/useSettingsStore.ts: -------------------------------------------------------------------------------- 1 | import { Identifier } from "deepslate"; 2 | import { defineStore } from "pinia"; 3 | import { computed, ref, watch } from "vue"; 4 | import { useI18n } from "vue-i18n"; 5 | import { useDatapackStore } from "./useDatapackStore"; 6 | import { EventTracker } from "../util/EventTracker"; 7 | import { parseSeed, updateUrlParam, versionMetadata } from "../util"; 8 | 9 | export const useSettingsStore = defineStore('settings', () => { 10 | const defaults = { 11 | mc_version: "1_21_5", 12 | world_preset: "minecraft:normal", 13 | dimension: "minecraft:overworld", 14 | seed: "0" 15 | } 16 | 17 | const uri = window.location.search.substring(1) 18 | const params = {...defaults, ...Object.fromEntries(new URLSearchParams(uri))} 19 | 20 | if (versionMetadata[params.mc_version] === undefined){ 21 | params.mc_version = defaults.mc_version 22 | updateUrlParam('mc_version') 23 | } 24 | 25 | const i18n = useI18n() 26 | 27 | const collator = computed(() => new Intl.Collator(i18n.locale.value.replace('_','-'))) 28 | 29 | const dev_mode = ref(false) 30 | const mc_version = ref(versionMetadata[params.mc_version] ? params.mc_version : defaults.mc_version) 31 | const world_preset = ref(Identifier.parse(params.world_preset)) 32 | const dimension = ref(Identifier.parse(params.dimension)) 33 | const seed = ref(parseSeed(params.seed)) 34 | 35 | const datapackStore = useDatapackStore() 36 | 37 | watch(mc_version, (new_version) => { 38 | updateUrlParam('mc_version', new_version, defaults.mc_version) 39 | EventTracker.track(`change_version/${new_version}`) 40 | }) 41 | 42 | watch(world_preset, (new_preset) => { 43 | updateUrlParam('world_preset', new_preset.toString(), defaults.world_preset) 44 | EventTracker.track(`change_world_preset`) 45 | }) 46 | 47 | watch(dimension, (new_dimension) => { 48 | updateUrlParam('dimension', new_dimension.toString(), defaults.dimension) 49 | EventTracker.track(`change_dimension`) 50 | }) 51 | 52 | watch(dev_mode, (new_dev_mode) => { 53 | EventTracker.track(`change_dev_mode/${new_dev_mode}`) 54 | }) 55 | 56 | watch(seed, (new_seed) => { 57 | updateUrlParam('seed', `${new_seed}`) 58 | }) 59 | 60 | datapackStore.$subscribe(async () => { 61 | if ((await datapackStore.world_presets)?.findIndex((id) => id.equals(world_preset.value)) === -1) { 62 | world_preset.value = (await datapackStore.world_presets)[0] 63 | } 64 | 65 | if ((await datapackStore.dimensions)?.findIndex((id) => id.equals(dimension.value)) === -1) { 66 | dimension.value = (await datapackStore.dimensions)[0] 67 | } 68 | }) 69 | 70 | function getLocalizedName(type: string, id: Identifier, path_only: boolean){ 71 | const fallbackString = path_only ? id.path : id.toString() 72 | if (dev_mode.value){ 73 | return fallbackString 74 | } 75 | return i18n.t(`minecraft.${type}.${id.namespace}.${id.path.replace('/','.')}`, fallbackString) 76 | } 77 | 78 | 79 | return {mc_version, world_preset, dimension, seed, collator, dev_mode, getLocalizedName} 80 | }) 81 | -------------------------------------------------------------------------------- /src/stores/useUiStore.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from "pinia"; 2 | import { ref } from "vue"; 3 | 4 | export const useUiStore = defineStore('ui', () => { 5 | const modrinthMenuOpen = ref(false) 6 | 7 | return { modrinthMenuOpen } 8 | }) 9 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 | line-height: 1.5; 4 | font-weight: 400; 5 | 6 | color-scheme: light dark; 7 | color: rgba(255, 255, 255, 0.87); 8 | background-color: #242424; 9 | overflow: hidden; 10 | 11 | font-synthesis: none; 12 | text-rendering: optimizeLegibility; 13 | -webkit-font-smoothing: antialiased; 14 | -moz-osx-font-smoothing: grayscale; 15 | -webkit-text-size-adjust: 100%; 16 | } 17 | 18 | a { 19 | font-weight: 500; 20 | color: #646cff; 21 | text-decoration: inherit; 22 | } 23 | a:hover { 24 | color: #535bf2; 25 | } 26 | 27 | html { 28 | width: 100%; 29 | height: 100%; 30 | } 31 | 32 | body { 33 | margin: 0; 34 | display: flex; 35 | place-items: center; 36 | width: 100%; 37 | height: 100%; 38 | background-color: rgb(88, 88, 88); 39 | } 40 | 41 | h1 { 42 | font-size: 3.2em; 43 | line-height: 1.1; 44 | } 45 | 46 | button { 47 | border-radius: 8px; 48 | border: 1px solid transparent; 49 | padding: 0.6em 1.2em; 50 | font-size: 1em; 51 | font-weight: 500; 52 | font-family: inherit; 53 | background-color: #1a1a1a; 54 | cursor: pointer; 55 | transition: border-color 0.25s; 56 | } 57 | button:hover { 58 | border-color: #646cff; 59 | } 60 | button:focus, 61 | button:focus-visible { 62 | outline: 4px auto -webkit-focus-ring-color; 63 | } 64 | 65 | .card { 66 | padding: 2em; 67 | } 68 | 69 | #app { 70 | width: 100%; 71 | height: 100%; 72 | } 73 | 74 | @media (prefers-color-scheme: light) { 75 | :root { 76 | color: #213547; 77 | background-color: #ffffff; 78 | } 79 | a:hover { 80 | color: #747bff; 81 | } 82 | button { 83 | background-color: #f9f9f9; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/util/CachedBiomeSource.ts: -------------------------------------------------------------------------------- 1 | import { BiomeSource, Climate, Identifier } from "deepslate"; 2 | 3 | 4 | const CACHE_SIZE = 11 5 | const CACHE_CENTER = 4 6 | 7 | export class CachedBiomeSource implements BiomeSource { 8 | private cache: Map = new Map() 9 | private cache_center_x: number = 0 10 | private cache_center_z: number = 0 11 | 12 | 13 | constructor( 14 | private readonly base: BiomeSource 15 | ) { } 16 | 17 | public setupCache(x: number, z: number) { 18 | this.cache.clear() 19 | this.cache_center_x = x 20 | this.cache_center_z = z 21 | } 22 | 23 | getBiome(x: number, y: number, z: number, climateSampler: Climate.Sampler): Identifier { 24 | if ((Math.abs(x - this.cache_center_x) > CACHE_CENTER) || (Math.abs(z - this.cache_center_z) > CACHE_CENTER)){ 25 | return this.base.getBiome(x, y, z, climateSampler) 26 | } 27 | 28 | const cache_index 29 | = (y + 64) * CACHE_SIZE * CACHE_SIZE 30 | + (x - this.cache_center_x + CACHE_CENTER) * CACHE_SIZE 31 | + (z - this.cache_center_z + CACHE_CENTER) 32 | 33 | const cached = this.cache.get(cache_index) 34 | if (cached) { 35 | //console.log('cache hit!') 36 | return cached 37 | } else { 38 | //console.log('cache miss!') 39 | const biome = this.base.getBiome(x, y, z, climateSampler) 40 | this.cache.set(cache_index, biome) 41 | return biome 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /src/util/EventTracker.ts: -------------------------------------------------------------------------------- 1 | export namespace EventTracker { 2 | export function track(event: string ){ 3 | if ((window as any).beam !== undefined) { 4 | (window as any).beam("/event/" + event) 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /src/util/SpawnTarget.ts: -------------------------------------------------------------------------------- 1 | import { Climate, Json } from "deepslate"; 2 | 3 | 4 | export class SpawnTarget{ 5 | 6 | constructor( 7 | private paramPoints: Climate.ParamPoint[], 8 | private algorithm: SpawnTarget.Algorithm 9 | ){ 10 | 11 | } 12 | 13 | public static fromJson(obj: unknown, algorithm: SpawnTarget.Algorithm){ 14 | return new SpawnTarget(Json.readArray(obj, Climate.ParamPoint.fromJson) ?? [], algorithm) 15 | } 16 | 17 | public getSpawnPoint(climateSampler: Climate.Sampler): [number, number] { 18 | const self = this 19 | var result: [number, number] = [0, 0] 20 | var result_fitness = getFitness(0, 0) 21 | 22 | radialSearch(2048, 512, 0, 0) 23 | radialSearch(512, 32, result[0], result[1]) 24 | 25 | return result 26 | 27 | function getFitness(x: number, z: number){ 28 | const climate = climateSampler.sample(x >> 2, 0, z >> 2) 29 | const surfaceClimate = Climate.target(climate.temperature, climate.humidity, climate.continentalness, climate.erosion, 0, climate.weirdness) 30 | const climateFitness = Math.min(...self.paramPoints.map(p => p.fittness(surfaceClimate))) 31 | 32 | switch (self.algorithm) { 33 | case SpawnTarget.Algorithm.LEGACY_ZERO_BIASED: 34 | const distanceFitness = Math.pow((x * x + z * z) / (2500 * 2500),2); 35 | return distanceFitness + climateFitness 36 | case SpawnTarget.Algorithm.BEST_CLIMATE: 37 | return BigInt(x*x + z*z) + BigInt(2048 * 2048) * BigInt(Math.floor(10000 * 10000 * climateFitness)) 38 | } 39 | } 40 | 41 | function radialSearch(maxRadius: number, radiusStep: number, centerX: number, centerZ: number) { 42 | var angle = 0 43 | var radius = radiusStep 44 | 45 | while(radius <= maxRadius) { 46 | const x = centerX + Math.floor(Math.sin(angle) * radius) 47 | const z = centerZ + Math.floor(Math.cos(angle) * radius) 48 | const fitness = getFitness(x, z) 49 | if (fitness < result_fitness) { 50 | result = [x, z]; 51 | result_fitness = fitness 52 | } 53 | 54 | angle += radiusStep / radius 55 | if (angle > Math.PI * 2) { 56 | angle = 0 57 | radius += radiusStep 58 | } 59 | } 60 | } 61 | } 62 | } 63 | 64 | export namespace SpawnTarget { 65 | export enum Algorithm { 66 | LEGACY_ZERO_BIASED, 67 | BEST_CLIMATE 68 | } 69 | } 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/util/TextComponent.ts: -------------------------------------------------------------------------------- 1 | export class TextComponent{ 2 | private constructor( 3 | readonly text?: string, 4 | readonly translate: boolean = false, 5 | public extra?: TextComponent[], 6 | readonly formatting?: { 7 | color?: string, 8 | bold?: boolean, 9 | italic?: boolean, 10 | underlined?: boolean, 11 | strikethrough?: boolean, 12 | obfuscated?: boolean 13 | } 14 | ){ 15 | 16 | } 17 | 18 | public toString(): string{ 19 | return (this.text ?? "") + (this.extra?.map(e => e.toString()).join("") ?? "") 20 | } 21 | 22 | public static parse(json: any): TextComponent{ 23 | if (typeof(json) === "boolean" || typeof(json) === "number" || typeof(json) === "string"){ 24 | return new TextComponent(json.toString()) 25 | } else if (Array.isArray(json)){ 26 | const component = TextComponent.parse(json.shift()) 27 | 28 | if (component.extra === undefined) 29 | component.extra = [] 30 | 31 | component.extra.push(...json.map(j => TextComponent.parse(j))) 32 | return component 33 | } else { 34 | const formatting = { 35 | ...(json.color && {color: TextComponent.parseColor(json.color)}), 36 | ...(json.bold !== undefined && {bold: json.bold}), 37 | ...(json.italic !== undefined&& {italic: json.italic}), 38 | ...(json.underlined !== undefined&& {underlined: json.underlined}), 39 | ...(json.strikethrough !== undefined&& {strikethrough: json.strikethrough}), 40 | ...(json.obfuscated !== undefined && {obfuscated: json.obfuscated}), 41 | } 42 | 43 | if (json.text !== undefined){ 44 | return new TextComponent(json.text, false, json.extra?.map((j: any) => TextComponent.parse(j)), formatting) 45 | } else if (json.translate) { 46 | return new TextComponent(json.translate, true, json.extra?.map((j: any) => TextComponent.parse(j)), formatting) 47 | } else { 48 | return new TextComponent(json.score ?? json.selector ?? json.keybind ?? json.nbt, false, json.extra?.map((j: any) => TextComponent.parse(j)), formatting) 49 | } 50 | } 51 | } 52 | 53 | private static parseColor(color: string){ 54 | switch (color) { 55 | case "black": return "#000000" 56 | case "dark_blue": return "#0000AA" 57 | case "dark_green": return "#00AA00" 58 | case "dark_aqua": return "#00AAAA" 59 | case "dark_red": return "#AA0000" 60 | case "cark_purple": return "#AA00AA" 61 | case "gold": return "#FFAA00" 62 | case "gray": return "#AAAAAA" 63 | case "dark_gray": return "#555555" 64 | case "blue": return "#5555FF" 65 | case "green": return "#55FF55" 66 | case "aqua": return "#55FFFF" 67 | case "red": return "#FF5555" 68 | case "light_purple": return "#FF55FF" 69 | case "yellow": return "#FFFF55" 70 | case "white": return "#FFFFFF" 71 | default: 72 | if (color.match(/^#[0-9A-Fa-f]{6}$/g)) return color 73 | return undefined 74 | 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /src/util/base64ArrayBuffer.ts: -------------------------------------------------------------------------------- 1 | /* 2 | MIT LICENSE 3 | Copyright 2011 Jon Leighton 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 7 | */ 8 | 9 | export function base64ArrayBuffer(arrayBuffer: ArrayBuffer) { 10 | var base64 = '' 11 | var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' 12 | 13 | var bytes = new Uint8Array(arrayBuffer) 14 | var byteLength = bytes.byteLength 15 | var byteRemainder = byteLength % 3 16 | var mainLength = byteLength - byteRemainder 17 | 18 | var a, b, c, d 19 | var chunk 20 | 21 | // Main loop deals with bytes in chunks of 3 22 | for (var i = 0; i < mainLength; i = i + 3) { 23 | // Combine the three bytes into a single integer 24 | chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2] 25 | 26 | // Use bitmasks to extract 6-bit segments from the triplet 27 | a = (chunk & 16515072) >> 18 // 16515072 = (2^6 - 1) << 18 28 | b = (chunk & 258048) >> 12 // 258048 = (2^6 - 1) << 12 29 | c = (chunk & 4032) >> 6 // 4032 = (2^6 - 1) << 6 30 | d = chunk & 63 // 63 = 2^6 - 1 31 | 32 | // Convert the raw binary segments to the appropriate ASCII encoding 33 | base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d] 34 | } 35 | 36 | // Deal with the remaining bytes and padding 37 | if (byteRemainder == 1) { 38 | chunk = bytes[mainLength] 39 | 40 | a = (chunk & 252) >> 2 // 252 = (2^6 - 1) << 2 41 | 42 | // Set the 4 least significant bits to zero 43 | b = (chunk & 3) << 4 // 3 = 2^2 - 1 44 | 45 | base64 += encodings[a] + encodings[b] + '==' 46 | } else if (byteRemainder == 2) { 47 | chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1] 48 | 49 | a = (chunk & 64512) >> 10 // 64512 = (2^6 - 1) << 10 50 | b = (chunk & 1008) >> 4 // 1008 = (2^6 - 1) << 4 51 | 52 | // Set the 2 least significant bits to zero 53 | c = (chunk & 15) << 2 // 15 = 2^4 - 1 54 | 55 | base64 += encodings[a] + encodings[b] + encodings[c] + '=' 56 | } 57 | 58 | return base64 59 | } -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/webworker/MultiNoiseCalculator.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare const self: ServiceWorkerGlobalScope; 4 | export { }; 5 | 6 | import { Climate, DensityFunction, WorldgenRegistries, Identifier, Holder, NoiseRouter, NoiseGeneratorSettings, RandomState, NoiseParameters, MultiNoiseBiomeSource, BiomeSource, FixedBiomeSource } from "deepslate" 7 | 8 | class MultiNoiseCalculator { 9 | 10 | private state: { 11 | sampler?: Climate.Sampler, 12 | biomeSource?: BiomeSource, 13 | surfaceDensityFunction?: DensityFunction, 14 | terrainDensityFunction?: DensityFunction, 15 | noiseGeneratorSettings?: NoiseGeneratorSettings 16 | randomState?: RandomState 17 | y: number, 18 | seed: bigint, 19 | projectDown: boolean 20 | generationVersion: number 21 | } = { 22 | y: 0, 23 | seed: BigInt(0), 24 | generationVersion: -1, 25 | projectDown: true 26 | } 27 | 28 | private taskQueue: any[] = [] 29 | 30 | public update(update: { 31 | biomeSourceJson?: unknown, 32 | noiseGeneratorSettingsJson?: unknown, 33 | densityFunctions?: { [key: string]: unknown }, 34 | noises?: { [key: string]: unknown }, 35 | surfaceDensityFunctionId?: string, 36 | terrainDensityFunctionId?: string, 37 | generationVersion?: number 38 | 39 | seed?: bigint, 40 | y?: number, 41 | project_down: boolean 42 | }) { 43 | this.state.seed = update.seed ?? this.state.seed 44 | this.state.y = update.y ?? this.state.y 45 | this.state.projectDown = update.project_down ?? this.state.projectDown 46 | this.state.generationVersion = update.generationVersion ?? this.state.generationVersion 47 | 48 | if (update.biomeSourceJson) { 49 | this.state.biomeSource = BiomeSource.fromJson(update.biomeSourceJson) 50 | } 51 | 52 | 53 | if (update.densityFunctions) { 54 | WorldgenRegistries.DENSITY_FUNCTION.clear() 55 | for (const id in update.densityFunctions) { 56 | const df = new DensityFunction.HolderHolder(Holder.parser(WorldgenRegistries.DENSITY_FUNCTION, DensityFunction.fromJson)(update.densityFunctions[id])) 57 | WorldgenRegistries.DENSITY_FUNCTION.register(Identifier.parse(id), df) 58 | } 59 | } 60 | 61 | if (update.noises) { 62 | WorldgenRegistries.NOISE.clear() 63 | for (const id in update.noises) { 64 | const noise = NoiseParameters.fromJson(update.noises[id]) 65 | WorldgenRegistries.NOISE.register(Identifier.parse(id), noise) 66 | } 67 | } 68 | 69 | if (update.noiseGeneratorSettingsJson) { 70 | this.state.noiseGeneratorSettings = NoiseGeneratorSettings.fromJson(update.noiseGeneratorSettingsJson) 71 | this.state.randomState = new RandomState(this.state.noiseGeneratorSettings, this.state.seed) 72 | this.state.sampler = Climate.Sampler.fromRouter(this.state.randomState.router) 73 | } 74 | 75 | if (this.state.randomState && this.state.noiseGeneratorSettings) { 76 | if (update.surfaceDensityFunctionId === ""){ 77 | this.state.surfaceDensityFunction = undefined 78 | } else if (update.surfaceDensityFunctionId) { 79 | this.state.surfaceDensityFunction = new DensityFunction.HolderHolder( 80 | Holder.reference( 81 | WorldgenRegistries.DENSITY_FUNCTION, 82 | Identifier.parse(update.surfaceDensityFunctionId) 83 | )).mapAll(this.state.randomState.createVisitor(this.state.noiseGeneratorSettings.noise, this.state.noiseGeneratorSettings.legacyRandomSource)) 84 | } 85 | 86 | if (update.terrainDensityFunctionId === ""){ 87 | this.state.terrainDensityFunction = undefined 88 | } else if (update.terrainDensityFunctionId) { 89 | this.state.terrainDensityFunction = new DensityFunction.HolderHolder( 90 | Holder.reference( 91 | WorldgenRegistries.DENSITY_FUNCTION, 92 | Identifier.parse(update.terrainDensityFunctionId) 93 | )).mapAll(this.state.randomState.createVisitor(this.state.noiseGeneratorSettings.noise, this.state.noiseGeneratorSettings.legacyRandomSource)) 94 | } 95 | 96 | } 97 | 98 | this.taskQueue = [] 99 | } 100 | 101 | public addTask(task: any){ 102 | this.taskQueue.push(task) 103 | } 104 | 105 | public removeTask(key: string){ 106 | const index = this.taskQueue.findIndex((task) => task.key === key) 107 | if (index >= 0){ 108 | this.taskQueue.splice(index, 1) 109 | } 110 | } 111 | 112 | public async loop() { 113 | while (true) { 114 | if (this.taskQueue.length === 0) { 115 | await new Promise(r => setTimeout(r, 1000)); 116 | } else { 117 | const nextTaks = this.taskQueue.shift() 118 | this.calculateMultiNoiseValues(nextTaks.key, nextTaks.min.x, nextTaks.min.y, nextTaks.max.x, nextTaks.max.y, nextTaks.tileSize) 119 | await new Promise(r => setTimeout(r, 0)); 120 | } 121 | } 122 | } 123 | 124 | private calculateMultiNoiseValues(key: string, min_x: number, min_z: number, max_x: number, max_z: number, tileSize: number): void { 125 | const array: { surface: number, biome: string, terrain: number }[][] = Array(tileSize + 2) 126 | const step = (max_x - min_x) / tileSize 127 | for (let ix = -1; ix < tileSize + 2; ix++) { 128 | array[ix] = Array(tileSize + 2) 129 | for (let iz = -1; iz < tileSize + 2; iz++) { 130 | const x = ix * step + min_x 131 | const z = iz * step + min_z 132 | const surface = this.state.surfaceDensityFunction?.compute(DensityFunction.context(x * 4, this.state.y, z * 4)) ?? Number.POSITIVE_INFINITY 133 | const y = this.state.projectDown ? Math.min(surface, this.state.y) : this.state.y 134 | const biome = this.state.biomeSource?.getBiome(x, y >> 2, z, this.state.sampler!).toString() ?? "minecraft:plains" 135 | const terrain = this.state.terrainDensityFunction?.compute(DensityFunction.context(x * 4, y , z * 4)) ?? Number.POSITIVE_INFINITY 136 | array[ix][iz] = { surface, biome, terrain } 137 | } 138 | } 139 | 140 | postMessage({ key, array, step, generationVersion: this.state.generationVersion }) 141 | } 142 | } 143 | 144 | 145 | const multiNoiseCalculator = new MultiNoiseCalculator() 146 | multiNoiseCalculator.loop() 147 | 148 | self.onmessage = (evt: ExtendableMessageEvent) => { 149 | if ("update" in evt.data){ 150 | multiNoiseCalculator.update(evt.data.update) 151 | } else if ("task" in evt.data){ 152 | multiNoiseCalculator.addTask(evt.data.task) 153 | } else if ("cancel" in evt.data){ 154 | multiNoiseCalculator.removeTask(evt.data.cancel) 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "moduleResolution": "Node", 7 | "strict": true, 8 | "jsx": "preserve", 9 | "resolveJsonModule": true, 10 | "isolatedModules": true, 11 | "esModuleInterop": true, 12 | "lib": ["ESNext", "DOM", "DOM.Iterable"], 13 | "skipLibCheck": true, 14 | "noEmit": true, 15 | "types": [ 16 | "vite-plugin-pwa/client", 17 | "@types/wicg-file-system-access" 18 | ] 19 | }, 20 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], 21 | "references": [{ "path": "./tsconfig.node.json" }] 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /vanilla_datapack_base/data/c/worldgen/biome_colors.json: -------------------------------------------------------------------------------- 1 | { 2 | "minecraft:mushroom_fields": { "r": 250, "g": 145, "b": 248 }, 3 | "minecraft:deep_frozen_ocean": { "r": 52, "g": 120, "b": 162 }, 4 | "minecraft:deep_cold_ocean": { "r": 0, "g": 71, "b": 133 }, 5 | "minecraft:deep_ocean": { "r": 3, "g": 0, "b": 158 }, 6 | "minecraft:deep_lukewarm_ocean": { "r": 38, "g": 0, "b": 143 }, 7 | "minecraft:frozen_ocean": { "r": 32, "g": 175, "b": 255 }, 8 | "minecraft:cold_ocean": { "r": 0, "g": 123, "b": 255 }, 9 | "minecraft:ocean": { "r": 0, "g": 0, "b": 255 }, 10 | "minecraft:warm_ocean": { "r": 100, "g": 0, "b": 255 }, 11 | "minecraft:lukewarm_ocean": { "r": 76, "g": 0, "b": 255 }, 12 | "minecraft:frozen_river": { "r": 166, "g": 212, "b": 255 }, 13 | "minecraft:river": { "r": 77, "g": 130, "b": 255 }, 14 | "minecraft:swamp": { "r": 93, "g": 187, "b": 142 }, 15 | "minecraft:snowy_plains": { "r": 255, "g": 255, "b": 255 }, 16 | "minecraft:ice_spikes": { "r": 200, "g": 238, "b": 254 }, 17 | "minecraft:snowy_taiga": { "r": 209, "g": 255, "b": 211 }, 18 | "minecraft:plains": { "r": 115, "g": 228, "b": 63 }, 19 | "minecraft:forest": { "r": 0, "g": 153, "b": 3 }, 20 | "minecraft:taiga": { "r": 69, "g": 113, "b": 25 }, 21 | "minecraft:old_growth_spruce_taiga": { "r": 52, "g": 80, "b": 17 }, 22 | "minecraft:old_growth_pine_taiga": { "r": 68, "g": 77, "b": 0 }, 23 | "minecraft:sunflower_plains": { "r": 166, "g": 255, "b": 0 }, 24 | "minecraft:flower_forest": { "r": 119, "g": 188, "b": 1 }, 25 | "minecraft:birch_forest": { "r": 106, "g": 198, "b": 91 }, 26 | "minecraft:old_growth_birch_forest": { "r": 89, "g": 228, "b": 90 }, 27 | "minecraft:dark_forest": { "r": 1, "g": 116, "b": 1 }, 28 | "minecraft:savanna": { "r": 179, "g": 242, "b": 61 }, 29 | "minecraft:jungle": { "r": 0, "g": 255, "b": 0 }, 30 | "minecraft:eroded_badlands": { "r": 184, "g": 80, "b": 0 }, 31 | "minecraft:badlands": { "r": 255, "g": 111, "b": 0 }, 32 | "minecraft:wooded_badlands": { "r": 219, "g": 139, "b": 0 }, 33 | "minecraft:stony_shore": { "r": 102, "g": 102, "b": 102 }, 34 | "minecraft:snowy_beach": { "r": 214, "g": 218, "b": 170 }, 35 | "minecraft:beach": { "r": 255, "g": 249, "b": 138 }, 36 | "minecraft:desert": { "r": 255, "g": 255, "b": 0 }, 37 | "minecraft:windswept_savanna": { "r": 171, "g": 219, "b": 81 }, 38 | "minecraft:sparse_jungle": { "r": 128, "g": 255, "b": 0 }, 39 | "minecraft:snowy_slopes": { "r": 138, "g": 202, "b": 234 }, 40 | "minecraft:grove": { "r": 175, "g": 175, "b": 228 }, 41 | "minecraft:savanna_plateau": { "r": 128, "g": 171, "b": 48 }, 42 | "minecraft:windswept_gravelly_hills": { "r": 129, "g": 150, "b": 152 }, 43 | "minecraft:windswept_hills": { "r": 105, "g": 142, "b": 145 }, 44 | "minecraft:windswept_forest": { "r": 66, "g": 123, "b": 95 }, 45 | "minecraft:meadow": { "r": 210, "g": 255, "b": 61 }, 46 | "minecraft:jagged_peaks": { "r": 215, "g": 172, "b": 211 }, 47 | "minecraft:frozen_peaks": { "r": 222, "g": 222, "b": 222 }, 48 | "minecraft:stony_peaks": { "r": 173, "g": 191, "b": 225 }, 49 | "minecraft:bamboo_jungle": { "r": 0, "g": 255, "b": 87 }, 50 | "minecraft:mangrove_swamp": { "r": 39, "g": 84, "b": 66 }, 51 | "minecraft:deep_dark": { "r": 8, "g": 39, "b": 31 }, 52 | "minecraft:cherry_grove": { "r": 220, "g": 138, "b": 221}, 53 | "minecraft:pale_garden": { "r": 144, "g": 144, "b": 144}, 54 | "minecraft:soul_sand_valley": { "r": 140, "g": 132, "b": 108 }, 55 | "minecraft:nether_wastes": { "r": 163, "g": 62, "b": 62 }, 56 | "minecraft:crimson_forest": { "r": 219, "g": 60, "b": 46 }, 57 | "minecraft:warped_forest": { "r": 68, "g": 171, "b": 171 }, 58 | "minecraft:basalt_deltas": { "r": 79, "g": 73, "b": 66 }, 59 | "minecraft:the_end": { "r": 252, "g": 244, "b": 121 }, 60 | "minecraft:small_end_islands": { "r": 234, "g": 247, "b": 52 }, 61 | "minecraft:end_midlands": { "r": 170, "g": 179, "b": 55 }, 62 | "minecraft:end_highlands": { "r": 112, "g": 117, "b": 46 }, 63 | "minecraft:end_barrens": { "r": 199, "g": 204, "b": 137 }, 64 | "minecraft:the_void": { "r": 0, "g": 0, "b": 0 }, 65 | "minecraft:lush_caves": { "r": 112, "g": 255, "b": 79 }, 66 | "minecraft:dripstone_caves": { "r": 140, "g": 124, "b": 0 } 67 | } -------------------------------------------------------------------------------- /vanilla_datapack_base/data/c/worldgen/structure_icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "minecraft:ancient_city": {"item": "minecraft:sculk"}, 3 | "minecraft:bastion_remnant": {"item": "minecraft:gold_block"}, 4 | "minecraft:buried_treasure": {"item": "minecraft:chest"}, 5 | "minecraft:desert_pyramid": {"item": "minecraft:skull_pottery_sherd"}, 6 | "minecraft:end_city": {"item": "minecraft:purpur_pillar"}, 7 | "minecraft:fortress": {"item": "minecraft:nether_bricks"}, 8 | "minecraft:igloo": {"item": "minecraft:brewing_stand"}, 9 | "minecraft:jungle_pyramid": {"item": "minecraft:mossy_cobblestone"}, 10 | "minecraft:mansion": {"item": "minecraft:dark_oak_planks"}, 11 | "minecraft:ocean_ruin_cold": {"item": "minecraft:stone_bricks"}, 12 | "minecraft:ocean_ruin_warm": {"item": "minecraft:chiseled_sandstone"}, 13 | "minecraft:pillager_outpost": {"item": "minecraft:carved_pumpkin"}, 14 | "minecraft:shipwreck": {"item": "minecraft:oak_boat"}, 15 | "minecraft:shipwreck_beached": {"item": "minecraft:oak_chest_boat"}, 16 | "minecraft:stronghold": {"item": "minecraft:ender_eye"}, 17 | "minecraft:swamp_hut": {"item": "minecraft:flower_pot"}, 18 | "minecraft:trail_ruins": {"item": "minecraft:brush"}, 19 | "minecraft:trial_chambers": {"item": "minecraft:trial_spawner"}, 20 | "minecraft:village_desert": {"item": "minecraft:sandstone_stairs"}, 21 | "minecraft:village_plains": {"item": "minecraft:oak_stairs"}, 22 | "minecraft:village_savanna": {"item": "minecraft:acacia_stairs"}, 23 | "minecraft:village_snowy": {"item": "minecraft:packed_ice"}, 24 | "minecraft:village_taiga": {"item": "minecraft:spruce_log"} 25 | } -------------------------------------------------------------------------------- /vanilla_datapack_base/data/jacobsjo/tags/worldgen/structure/hidden_from_map.json: -------------------------------------------------------------------------------- 1 | { 2 | "replace": false, 3 | "values": [ 4 | "#minecraft:mineshaft", 5 | "#minecraft:ruined_portal", 6 | "minecraft:monument", 7 | "minecraft:nether_fossil", 8 | { 9 | "id": "#c:hidden_from_displayers", 10 | "required": false 11 | }, 12 | { 13 | "id": "#c:hide_on_map", 14 | "required": false 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /vanilla_datapack_base/data/minecraft/worldgen/density_function/overworld/snowcapped_surface.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "add", 3 | "argument1": 128, 4 | "argument2": { 5 | "type": "mul", 6 | "argument1": 128, 7 | "argument2": "minecraft:overworld/offset" 8 | } 9 | } -------------------------------------------------------------------------------- /vanilla_datapack_base/data/minecraft/worldgen/density_function/overworld_amplified/snowcapped_surface.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "add", 3 | "argument1": 128, 4 | "argument2": { 5 | "type": "mul", 6 | "argument1": 128, 7 | "argument2": "minecraft:overworld_amplified/offset" 8 | } 9 | } -------------------------------------------------------------------------------- /vanilla_datapack_base/data/minecraft/worldgen/density_function/overworld_large_biomes/snowcapped_surface.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "add", 3 | "argument1": 128, 4 | "argument2": { 5 | "type": "mul", 6 | "argument1": 128, 7 | "argument2": "minecraft:overworld_large_biomes/offset" 8 | } 9 | } -------------------------------------------------------------------------------- /vanilla_datapack_base/pack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobsjo/mc-datapack-map/86d8f729324912092b64778907ad0c32f440e961/vanilla_datapack_base/pack.png -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { VitePWA } from 'vite-plugin-pwa' 3 | import vue from '@vitejs/plugin-vue' 4 | import VueI18nPlugin from "@intlify/unplugin-vue-i18n/vite"; 5 | import path from 'path' 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | plugins: [ 10 | vue(), 11 | VueI18nPlugin({ 12 | include: [path.resolve(__dirname, './locales/**')] 13 | }), 14 | VitePWA({ 15 | injectRegister: 'script', 16 | registerType: 'autoUpdate', 17 | workbox: { 18 | globPatterns: ['**/*.{js,css,html,svg,png,zip,txt,webp,jar}'], 19 | maximumFileSizeToCacheInBytes: 2e+9, // 2 GB 20 | runtimeCaching: [ 21 | // structure icons from mcicons 22 | { 23 | urlPattern: /^https:\/\/raw\.githubusercontent\.com\/jacobsjo\/mcicons\/icons\/item\/.*/i, 24 | handler: 'CacheFirst', 25 | options: { 26 | cacheName: "mcicons-cache", 27 | expiration: { 28 | maxEntries: 3000, 29 | maxAgeSeconds: 60 * 60 * 24 * 90 // 90 days 30 | }, 31 | cacheableResponse: { 32 | statuses: [200] 33 | }, 34 | fetchOptions: { 35 | 36 | } 37 | } 38 | }, 39 | // datapacks/mods downloaded from modrinth cdn 40 | { 41 | urlPattern: /^https:\/\/cdn\.modrinth\.com\/data\/.*\.(zip|jar)$/i, 42 | handler: 'CacheFirst', 43 | options: { 44 | cacheName: "modrinth-cdn-cache", 45 | expiration: { 46 | maxEntries: 150, 47 | maxAgeSeconds: 60 * 60 * 24 * 365, // 365 days 48 | purgeOnQuotaError: true 49 | }, 50 | cacheableResponse: { 51 | statuses: [200] 52 | } 53 | } 54 | }, 55 | // thumbnails downloaded from modrinth cdn 56 | { 57 | urlPattern: /^https:\/\/cdn\.modrinth\.com\/data\/.*\.webp$/i, 58 | handler: 'CacheFirst', 59 | options: { 60 | cacheName: "modrinth-cdn-image-cache", 61 | expiration: { 62 | maxEntries: 3000, 63 | maxAgeSeconds: 60 * 60 * 24 * 365 // 365 days 64 | }, 65 | cacheableResponse: { 66 | statuses: [200] 67 | } 68 | } 69 | }, 70 | // modrinth api request for projects (not search), used as backup for recents in offline mode 71 | { 72 | urlPattern: /^https:\/\/api\.modrinth\.com\/v2\/project\/.*/i, 73 | handler: 'NetworkFirst', 74 | options: { 75 | cacheName: "modrinth-api-cache", 76 | expiration: { 77 | maxEntries: 3000, 78 | maxAgeSeconds: 60 * 60 * 24 * 30 // 30 days 79 | }, 80 | cacheableResponse: { 81 | statuses: [200] 82 | } 83 | } 84 | } 85 | 86 | ], 87 | skipWaiting: true, 88 | clientsClaim: true 89 | }, 90 | manifest: { 91 | name: 'Minecraft Datapack Map', 92 | short_name: 'MC Datapack Map', 93 | description: 'A Minecraft biome map capable of handling worldgen datapacks.', 94 | theme_color: '#03213a', 95 | icons: [ 96 | { 97 | src: 'favicon-192x192.png', 98 | sizes: '192x192', 99 | type: 'image/png' 100 | }, 101 | { 102 | src: 'favicon-512x512.png', 103 | sizes: '512x512', 104 | type: 'image/png' 105 | }, 106 | { 107 | src: 'favicon.svg', 108 | sizes: 'any', 109 | type: 'image/svg+xml' 110 | }, 111 | { 112 | src: 'favicon-monochrome.svg', 113 | sizes: 'any', 114 | type: 'image/svg+xml', 115 | purpose: 'monochrome' 116 | }, 117 | { 118 | src: 'favicon-maskable.svg', 119 | sizes: 'any', 120 | type: 'image/svg+xml', 121 | purpose: 'maskable' 122 | } 123 | 124 | ] 125 | } 126 | }) 127 | ], 128 | build: { 129 | sourcemap: true 130 | } 131 | }) 132 | --------------------------------------------------------------------------------