├── .gitignore
├── LICENSE
├── README.md
├── TODO.md
├── build.sh
├── buildSources
└── apache
│ └── .htaccess
├── docs
├── example_coloursJSON.jsonc
├── example_preset.jsonc
├── supportBlocks.md
└── textures.png.md
├── package.json
├── public
├── images
│ ├── favicon.ico
│ └── preview.png
├── index.html
└── robots.txt
├── src
├── components
│ ├── faq.css
│ ├── faq.js
│ ├── header.css
│ ├── header.js
│ ├── languages.css
│ ├── languages.js
│ ├── mapart
│ │ ├── autoCompleteInputBlockToAdd
│ │ │ ├── autoCompleteInputBlockToAdd.css
│ │ │ └── autoCompleteInputBlockToAdd.js
│ │ ├── blockImage.css
│ │ ├── blockImage.js
│ │ ├── blockSelection.css
│ │ ├── blockSelection.js
│ │ ├── blockSelectionAddCustom
│ │ │ ├── blockSelectionAddCustom.css
│ │ │ └── blockSelectionAddCustom.js
│ │ ├── bufferedNumberInput
│ │ │ ├── bufferedNumberInput.css
│ │ │ └── bufferedNumberInput.js
│ │ ├── greenButtons.css
│ │ ├── greenButtons.js
│ │ ├── json
│ │ │ ├── backgroundColourModes.json
│ │ │ ├── coloursJSON.json
│ │ │ ├── cropModes.json
│ │ │ ├── defaultPresets.json
│ │ │ ├── ditherMethods.json
│ │ │ ├── mapModes.json
│ │ │ ├── supportedVersions.json
│ │ │ └── whereSupportBlocksModes.json
│ │ ├── mapPreview.css
│ │ ├── mapPreview.js
│ │ ├── mapSettings.css
│ │ ├── mapSettings.js
│ │ ├── mapartController.css
│ │ ├── mapartController.js
│ │ ├── materials.css
│ │ ├── materials.js
│ │ ├── nbtReader.js
│ │ ├── viewOnline2D
│ │ │ ├── viewOnline2D.css
│ │ │ └── viewOnline2D.js
│ │ ├── viewOnline3D
│ │ │ ├── pointerLockControls.js
│ │ │ ├── viewOnline3D.css
│ │ │ └── viewOnline3D.js
│ │ ├── viewOnlineCommon
│ │ │ ├── waila.css
│ │ │ └── waila.js
│ │ └── workers
│ │ │ ├── mapCanvas.jsworker
│ │ │ └── nbt.jsworker
│ ├── root.css
│ ├── root.js
│ ├── tooltip.css
│ └── tooltip.js
├── cookieManager.js
├── images
│ ├── Palette128_Unobtainable_Trans.png
│ ├── classicVsValley.png
│ ├── gridOverlay.png
│ ├── null.png
│ ├── textures.png
│ └── upload.png
├── index.css
├── index.js
├── kenpixel_mini_square.woff
└── locale
│ ├── de
│ ├── flag.svg
│ └── strings.json
│ ├── en
│ ├── flag.svg
│ └── strings.json
│ ├── eo
│ ├── flag.svg
│ └── strings.json
│ ├── es
│ ├── flag.svg
│ └── strings.json
│ ├── et
│ ├── flag.svg
│ ├── flag_pop.svg
│ └── strings.json
│ ├── fr
│ ├── flag.svg
│ └── strings.json
│ ├── it
│ ├── flag.svg
│ └── strings.json
│ ├── ja
│ ├── flag.svg
│ └── strings.json
│ ├── locale.js
│ ├── lt
│ ├── flag.svg
│ └── strings.json
│ ├── pl
│ ├── flag.svg
│ └── strings.json
│ ├── pt-Br
│ ├── flag.svg
│ └── strings.json
│ ├── pt
│ ├── flag.svg
│ └── strings.json
│ ├── ru
│ ├── flag.svg
│ └── strings.json
│ ├── ua
│ ├── flag.svg
│ └── strings.json
│ ├── zh-Hans
│ ├── flag.svg
│ └── strings.json
│ └── zh-Hant
│ ├── flag.svg
│ └── strings.json
└── tools
├── JSONIO.py
├── Palette128.png
├── Palette128_Unobtainable.png
├── Palette128_Unobtainable_Trans.png
├── SAOLogging.py
├── addColoursJSONBlock.py
├── addColoursJSONColourSet.py
├── addLocaleLanguage.py
├── addLocaleString.py
├── addMinecraftVersion.py
└── createTestPaletteNBT.js
/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | /coverage
3 | /node_modules
4 | /package-lock.json
5 | /.pnp
6 | .pnp.js
7 | npm-debug.log*
8 | yarn-debug.log*
9 | yarn-error.log*
10 | .idea/
11 |
12 | __pycache__/
13 |
14 | /gitignore Extras
15 |
16 | *.nbt
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MapartCraft
2 |
3 | A Minecraft mapart schematic and map.dat generator, designed to be feasible for both server admins and survival players on servers like 2b2t, running in your browser.
4 |
5 | # Requirements
6 |
7 | MapartCraft is a static website written in ReactJS; running and building requires NPM / Node. Extra scripts in `tools` are written in Python3. `tools/addColoursJSONBlock.py` optionally uses [ImageMagick](https://imagemagick.org/) to manage `src/images/textures.png`.
8 |
9 | # Building
10 |
11 | 1. Acquire packages with `npm install`.
12 | 2. Build using `npm run build`, or run a debug version with `npm run start`.
13 | 3. Alternatively use the shell script `build.sh` for deployment on Linux. This will also copy a `.htaccess` file to the build folder for use with Apache.
14 |
15 | The default build settings assume the app is being hosted at https://YOUR-SITE-HERE.com/mapartcraft. To change the folder from which the site is hosted modify the following:
16 |
17 | - `homepage` in `package.json`
18 | - `basename` in the Router in `src/app.js`
19 | - The `RewriteRule` in `buildSources/apache/.htaccess` if using Apache
20 |
21 | # Usage
22 |
23 | Visit [MapartCraft](https://rebane2001.com/mapartcraft) on [rebane2001.com](https://rebane2001.com) or use a mirror on [web.archive.org](https://web.archive.org/web/*/https://rebane2001.com/mapartcraft). However, it is recommended to use the [rebane2001.com](https://rebane2001.com/mapartcraft) site as it is always up to date with new features and bugfixes.
24 |
25 | # Credits/Thanks
26 |
27 | - Minecraft for the block textures
28 | - [KenPixel Mini Square](https://opengameart.org/content/kenney-fonts) font by [Kenney](https://www.kenney.nl/)
29 | - [pako](https://www.npmjs.com/package/pako)'s zipping library
30 | - [jszip](https://www.npmjs.com/package/jszip)'s zipping library
31 | - [OpenMoji](https://github.com/hfg-gmuend/openmoji) for flags
32 | - Translation credits can be seen on the translated pages
33 | - [SelfAdjointOperator](https://github.com/SelfAdjointOperator) for some extra features
34 | - Code contributors can be seen on the [contributions page](https://github.com/rebane2001/mapartcraft/graphs/contributors)
35 |
--------------------------------------------------------------------------------
/TODO.md:
--------------------------------------------------------------------------------
1 | # Yes
2 |
3 | - Look at issues on Rebane repo
4 | - Review locale jsons, strings such as preprocessing, source existing locale strings for others
5 |
6 | # Maybe
7 |
8 | - CLI
9 | - 'Edit' mode for colour replacements etc: issue #124
10 | - Compositing for mapdat images when uploaded image has transparency and preprocessing background enabled
11 | - Linear / none interpolation option for small uploads if easy
12 | - 2.5D maps (jkascpkmc's Fox for inspo)
13 | - Flammable parameter glass layer
14 | - View online on mobile (low priority)
15 |
16 | # Low priority
17 |
18 | - `tools/addColoursJSONColourSet.py` use ImageMagick to update `tools/Palette*.png`
19 | - `tools/addColoursJSONBlock.py` update textures size in `viewOnline.js` automatically
20 |
--------------------------------------------------------------------------------
/build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | npm run build
4 | [ -n "$(command -v apache2)" ] && cp ./buildSources/apache/.htaccess ./build/.htaccess
5 | chmod o+rX-w -R ./build
6 |
--------------------------------------------------------------------------------
/buildSources/apache/.htaccess:
--------------------------------------------------------------------------------
1 | RewriteOptions InheritBefore
2 |
3 | RewriteEngine On
4 |
5 | AddType application/javascript .jsworker
6 |
7 | ExpiresActive on
8 | ExpiresDefault "access plus 1 day"
9 |
10 | RewriteCond %{REQUEST_FILENAME} !-f
11 | RewriteCond %{REQUEST_FILENAME} !-d
12 | RewriteCond %{REQUEST_FILENAME} !-l
13 | RewriteRule ^.*$ https://%{HTTP_HOST}/mapartcraft/index.html [P]
14 |
15 |
--------------------------------------------------------------------------------
/docs/example_coloursJSON.jsonc:
--------------------------------------------------------------------------------
1 | {
2 | "0": { // each set of blocks that produce a certain colour are grouped into a 'colour set', often refered to by 'colourSet'.
3 | // We keep this as a dictionary instead of a list so it is easier to see the 'colourSetId' key at a glance
4 | "tonesRGB": { // colours in RGB form
5 | "dark": [ // for staircasing
6 | 89,
7 | 125,
8 | 39
9 | ],
10 | "normal": [ // for flat maps
11 | 109,
12 | 153,
13 | 48
14 | ],
15 | "light": [ // for staircasing
16 | 127,
17 | 178,
18 | 56
19 | ],
20 | "unobtainable": [ // for mapdat files; unobtainable in survival
21 | 67,
22 | 94,
23 | 29
24 | ]
25 | },
26 | "blocks": {
27 | "0": { // block number within a colour set, often refered to by 'blockId'
28 | "displayName": "Grass Block", // Human readable name, used when hovering over block
29 | "validVersions": { // list of versions this block is used in as this colour
30 | "1.12.2": { // if this is a dictionary then it contains info for the NBT worker
31 | "NBTName": "grass",
32 | "NBTArgs": {}
33 | },
34 | "1.13.2": {
35 | "NBTName": "grass_block",
36 | "NBTArgs": {}
37 | },
38 | "1.14.4": "&1.13.2", // to avoid duplicates, when NBT info is kept the same across versions we reference
39 | // previous valid versions with "&${version}"
40 | "1.15.2": "&1.13.2",
41 | "1.16.5": "&1.13.2"
42 | },
43 | "supportBlockMandatory": false, // whether the block necessarily needs a support block under it, eg for carpet or sand.
44 | // see supportBlocks.md for more info
45 | "flammable": false, // currently unused. may be used in future in an option for whether to
46 | // place glass over the block in the .schematic to avoid lightning fires
47 | "presetIndex": 0 // blockId is used soley to choose the order in which blocks are displayed in blockSelection, and is the same as the block's
48 | // horizontal index in textures.png. presetIndex is used to generate and import from preset URLs; this stays constant for
49 | // a block for forwards compatibility and allows blockIds / textures.png to change arbitrarily without breaking presets
50 | },
51 | "1": {
52 | "displayName": "Slime Block",
53 | "validVersions": {
54 | "1.12.2": {
55 | "NBTName": "slime",
56 | "NBTArgs": {}
57 | },
58 | "1.13.2": {
59 | "NBTName": "slime_block",
60 | "NBTArgs": {}
61 | },
62 | "1.14.4": "&1.13.2",
63 | "1.15.2": "&1.13.2",
64 | "1.16.5": "&1.13.2"
65 | },
66 | "supportBlockMandatory": true,
67 | "flammable": false,
68 | "presetIndex": 1
69 | }
70 | }
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/docs/example_preset.jsonc:
--------------------------------------------------------------------------------
1 | // Presets are stored as a list of the following object
2 | {
3 | "name": "My Preset", // Name to display the preset as
4 | "localeKey": "BLOCK-SELECTION/PRESETS/BLAH", // localeKey only appears in default presets, and it is a neat way solution to localisation of default presets;
5 | // the controller will try to read for 'localeKey' first, else will default to 'name'
6 | "blocks": [
7 | [
8 | 11, // Colour set number as defined in example_coloursJSON.jsonc
9 | 6 // Block number as defined in example_coloursJSON.jsonc
10 | ],
11 | [
12 | 14, // Orangey
13 | 0 // Orange Wool
14 | ]
15 | // All non-specified colour sets will be reset to block number '-1' ie disabled when the preset is loaded
16 | ]
17 | }
18 |
--------------------------------------------------------------------------------
/docs/supportBlocks.md:
--------------------------------------------------------------------------------
1 | # Whether a block needs support block(s) underneath it
2 |
3 |
4 |
5 |
6 | This document discusses methods used by the `Add blocks under` option.
7 |
8 | __NB__: when we say 'gravity affected block' we actually mean 'block that mandates support beneath it'. For example: cobwebs, beacons, pressure plates etc. Sand, gravel, and concrete powder are just the first that come to my mind...
9 |
10 | ## No blocks
11 |
12 | This is a self explanatory and pretty useless option as sand will fall and pressure plates 'pop' up
13 |
14 | ## Important blocks
15 |
16 | For a block `B` that is affected by gravity we place a support block `S` below `B` to hold it up. This is a primitive method and is useful for pasting schematics in creative mode if mapdats are not an option. This method does not require knowledge of any blocks South of `B` to function, hence the count for support blocks can be updated as we create the map preview from North to South. However this method is not the best for building schematics in survival as the following options discuss.
17 |
18 | ## All blocks (optimized)
19 |
20 | This option places support blocks as in [Important blocks](#Important-blocks), and also one to the North (`N`) and one to the South (`Z`) of `S` to allow `S` to be placed before `B` is placed, building the map in survival either from North to South or South to North, as in instance 3 below. One can imagine that without `N` and `Z`, `B` would fall under gravity before `S` could be built.
21 |
22 | This option also adds support blocks when the map height changes to make building staircases easier in survival.
23 |
24 | One way to go about implementing this method would be to add `N` and `Z` to the NBT / schematic whenever a gravity affected block is found, however this could lead to collisions between support-blocks and actual map blocks. Therefore instead we check the following seven criteria.
25 |
26 | ### Key
27 | | Symbol | Means |
28 | | ------ | ----- |
29 | | ⬜ | Air |
30 | | 🟥 | Support block caused by ⬛ |
31 | | 🟧 | Support block caused by 🟩 or 🟦 |
32 | | 🟨 | Possible block to the North (unimportant) |
33 | | 🟩 | Block to the North causing support blocks |
34 | | ⬛ | Block for which we are trying to find out whether support blocks are required underneath |
35 | | 🟦 | Block to the South causing support blocks |
36 | | 🟪 | Possible block to the South (unimportant) |
37 |
38 | ### The five instances in which a block needs a support block one block beneath it
39 |
40 | 1. Block has light tone
41 | ```
42 | ⬜⬛
43 | 🟨🟥
44 | ```
45 |
46 | 2. Block to the South has dark tone
47 | ```
48 | ⬛⬜
49 | 🟧🟦
50 | ```
51 |
52 | 3. Block is gravity affected
53 | ```
54 | 🟨⬛🟪 B
55 | 🟥🟥🟥 equivalently: NSZ
56 | ```
57 |
58 | 4. Block to the South has normal tone and is gravity affected
59 | ```
60 | ⬛🟦🟪
61 | 🟧🟧🟧
62 | ```
63 |
64 | 5. Block has normal tone and the block to the North is gravity affected
65 | ```
66 | 🟨🟩⬛
67 | 🟧🟧🟧
68 | ```
69 |
70 | Instances 1 and 2 are consequences of changing map-height, 3, 4, 5 because of gravity affected blocks
71 |
72 | ### The two instances in which a block needs a support block two blocks beneath it
73 |
74 | 6. Block to the South has dark tone and is gravity affected
75 | ```
76 | ⬛⬜⬜
77 | 🟧🟦🟪
78 | 🟧🟧🟧
79 | ```
80 |
81 | 7. Block has light tone and the block to the North is gravity affected
82 | ```
83 | ⬜⬜⬛
84 | ⬜🟩🟥
85 | 🟧🟧🟧
86 | ```
87 |
88 | Instances 6 and 7 combine both changing map-height and gravity affected blocks
89 |
90 | These seven instances apply to the average block in a column, where a 'column' is a slice of the map running from North to South. However, there are some special cases:
91 |
92 | - Noobline: Only instances 2, 4, 6 apply
93 | - First (non-noobline) block: Only instances 1, 2, 3, 4, 6 apply
94 | - Last block: Only instances 1, 3, 5, 7 apply
95 |
96 | Some of these criteria require knowledge of the map block to the South of `B`, whether it is gravity affected and what tone it is. Hence if we are creating the colourSet and toneKeys, and counting support blocks at the same time in one for-loop for the map preview from North to South (as in `src/components/mapart/workers/mapCanvas.jsworker` so that progress reports feel accurate) we work 'one cycle behind' in counting support blocks; we switch based on the z-value of the pixel we have just worked out the colourSet and toneKey for:
97 |
98 | - Case 0: Check the relevant instances for whether the noobline needs support
99 | - Case 1: Check the relevant instances for whether the first non-noobline block needs support
100 | - Case 127: Check the relevant instances for whether the last block in the column needs support __and fallthrough to default case__
101 | - Default: Having calculated colourSet and toneKey for z-value `z`, check the instances for whether the block at z-value `z-1` needs support
102 |
103 | ## All blocks double (optimized)
104 |
105 | The reason for this mode is to enable the user to build all of the support blocks first instead of juggling many shulkers full of support blocks alongside each material required to build the visible map at the same time as in [All blocks (optimized)](#All-blocks-(optimized)). This mode requires a lot more support blocks, building an entire layer of 128*128 = 16384 at the minimum, however this is often not an issue for many players (collecting stacks of netherrack from 2b2t tunnels is easy). I (SelfAdjointOperator) have built 2x1 maps both in single and double mode before: although double mode can seem tedious at first, placing support blocks to seemingly no end, it is pleasant being able to then build the map colourSet by colourSet, with less inventory management problems. However, this was before single-blocks mode was optimized; I will compare in the future which I think is the best use of time.
106 |
107 | In effect we create a carbon-copy of the map structure as it would appear in [No blocks](#No-blocks) one block below the original, made entirely out of support blocks. We then only have to add extra support blocks for height changes as in instances 1 and 2 of [All blocks (optimized)](#All-blocks-(optimized)). This is a little easier to code than single-blocks mode, and `Case 1` does not need to be treated specially.
108 |
--------------------------------------------------------------------------------
/docs/textures.png.md:
--------------------------------------------------------------------------------
1 | # Textures.png
2 |
3 | The image `src/images/textures.png` contains all the textures of blocks for the block selection component, and a few other textures. The textures are arranged into a grid of 32x32px entries, y-position corresponding to colourSetId, x-position corresponding to blockId within a colourSet. There are 65 rows to `textures.png`: the first 64 correspond to the (soft limit) of 64 colours that Mojang use in maps so far.
4 |
5 | The 65th row at the bottom contains extra textures, currently:
6 |
7 | - Reserved blank / transparent
8 | - Barrier
9 | - Placeholder block (for unknown support block)
10 | - Plus for preview size
11 | - Minus for preview size
12 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mapartcraft-react",
3 | "version": "0.1.0",
4 | "private": true,
5 | "homepage": "/mapartcraft",
6 | "dependencies": {
7 | "@testing-library/jest-dom": "^5.11.10",
8 | "@testing-library/react": "^11.2.5",
9 | "@testing-library/user-event": "^12.8.3",
10 | "jszip": "^3.6.0",
11 | "pako": "^1.0.11",
12 | "react": "^17.0.2",
13 | "react-dom": "^17.0.2",
14 | "react-router-dom": "^5.2.0",
15 | "react-scripts": "4.0.3",
16 | "three": "^0.129.0",
17 | "web-vitals": "^1.1.1"
18 | },
19 | "scripts": {
20 | "start": "react-scripts start",
21 | "build": "react-scripts build",
22 | "test": "react-scripts test",
23 | "eject": "react-scripts eject"
24 | },
25 | "eslintConfig": {
26 | "extends": [
27 | "react-app",
28 | "react-app/jest"
29 | ]
30 | },
31 | "browserslist": {
32 | "production": [
33 | ">0.2%",
34 | "not dead",
35 | "not op_mini all"
36 | ],
37 | "development": [
38 | "last 1 chrome version",
39 | "last 1 firefox version",
40 | "last 1 safari version"
41 | ]
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/public/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/public/images/favicon.ico
--------------------------------------------------------------------------------
/public/images/preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/public/images/preview.png
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | MapartCraft
31 |
32 |
33 |
34 | You need to enable JavaScript to run this app.
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/components/faq.css:
--------------------------------------------------------------------------------
1 | .FAQ h2 {
2 | margin-block: 0.5em !important;
3 | text-decoration: underline;
4 | }
5 |
6 | .FAQ p {
7 | margin-top: 0.1em;
8 | }
9 |
--------------------------------------------------------------------------------
/src/components/faq.js:
--------------------------------------------------------------------------------
1 | import { Link } from "react-router-dom";
2 |
3 | import "./faq.css";
4 | import IMG_Palette from "../images/Palette128_Unobtainable_Trans.png";
5 | import IMG_ClassicVsValley from "../images/classicVsValley.png";
6 |
7 | function FAQ(props) {
8 | return (
9 |
10 |
11 |
Close
12 |
13 |
14 |
FAQ
15 |
16 |
How do I get started?
17 |
18 | Video tutorial
19 |
20 |
21 |
General
22 |
Why does the output change with the same image and settings?
23 |
24 | The JPEG decoding and scaling algorithms vary between browsers and get changed all the time. If you wish to be 100% sure your image stays the same,
25 | right click on the Map preview and choose Save image as... . Next time you can upload the image you saved.
26 |
27 |
28 |
Schematic (.nbt)
29 |
What do I do with the NBT file?
30 |
Use it like a .schematic file.
31 |
32 |
How can I use the NBT file?
33 |
34 | You can use it with programs like{" "}
35 |
36 | cubical.xyz
37 |
38 | ,{" "}
39 |
40 | MCEdit
41 | {" "}
42 | and mods like{" "}
43 |
44 | Schematica
45 | {" "}
46 | /{" "}
47 |
48 | Litematica
49 |
50 | . You can also import them into your game directly with a structure block - although it might require a redstone power source (
51 |
52 | #100
53 |
54 | ). It might be a better idea to use a datafile instead - it's easier and gives more colors.
55 |
56 |
57 |
...but I need a .schematic file!
58 |
59 | Import it into{" "}
60 |
61 | cubical.xyz
62 | {" "}
63 | or{" "}
64 |
65 | MCEdit
66 | {" "}
67 | and export as .schematic. Note that if you're using MCEdit or Cubical, you must export the map as 1.12.2. You do not need a .schematic file for
68 | use with Baritone; use Schematica and the "#schematica" command.
69 |
70 |
71 |
But MCEdit doesn't work!
72 |
73 | Make sure you're using{" "}
74 |
75 | MCEdit Unified
76 | {" "}
77 | and importing the NBT as a schematic, NOT loading it as a world. Alternatively, use Cubical.
78 |
79 |
80 |
Why is there a row of extra blocks?
81 |
82 | The shade a block shows up as on the map is decided by the block North of it; if the Northern block is higher then a darker tone shows, else if the
83 | Northern block is lower then a lighter tone shows, else a normal tone shows. Thus an extra row of blocks (colloquially known as a noobline) exists at
84 | the top of a map to shade the top row properly.
85 |
86 |
87 |
How do I align the map?
88 |
89 | When you have found a suitable place to build your map (eg above an ocean) make sure to open the map first and find the bottom left corner for aligning
90 | your schematic. Maps in Minecraft align to a fixed 128x128 grid. North is always the up-direction on maps and you shouldn't need to rotate the schematic.
91 |
92 |
93 |
Datafile (.dat)
94 |
What is a map.dat file?
95 |
96 | '.dat' is the native format Minecraft stores map data in, meaning you can use it to import maps into your worlds without needing to build a physical
97 | structure. It also enables you to use a fourth extra shade of color not accessible in survival.
98 |
99 |
100 |
What do I do with the map.dat file?
101 |
102 | You can use the map.dat file in singleplayer or a server you own. Create a new map in-game, go to your world's save file, then the data folder and from
103 | there you can replace map_xxx.dat files. MapartCraft downloads a .zip file containing all of the 1x1 map.dat files.
104 |
105 |
106 |
Settings
107 |
Map size?
108 |
109 | This will define how many maps you will create for your picture. When creating bigger maps, it's recommended to split it into multiple schematics (lest
110 | large staircased maps stretch above the world height limit). This can be done with the "DOWNLOAD AS 1X1 SPLIT" button which downloads all the 1x1 NBTs in a .zip file.
111 |
112 |
113 |
My image is stretched!
114 |
Change your map size, enable the crop option, or edit your image with an image editor.
115 |
116 |
'Staircasing'?
117 |
118 | This will make your map 3D. Doing so will give you 3 times the colors, often producing a much richer mapart, but it will also make the map a lot harder
119 | to build, as it is not flat. 3D 'Classic' and 'Valley' modes produce the exact same resulting map image, however they are built differently; 'Valley' mode allows the map to be built without any downwards staircases, which may be easier in survival. Observe the difference:
120 |
121 |
122 |
123 |
124 |
125 | More staircasing modes can be enabled from the Extras settings tab.
126 |
127 |
128 |
Better color?
129 |
130 | This setting will give you more natural colors. Disabling this will make the website faster and give you slightly worse colors. It is recommended to
131 | keep this enabled.
132 |
133 |
134 |
Dithering?
135 |
136 | This will add grain to your image to make it look a lot smoother. Floyd-Steinberg dithering is the most accurate, but the Ordered/Bayer dithering will
137 | usually have less artifacts and gives the image an unique style. It is usually recommended to disable dithering for flat-colored artwork.
138 |
139 |
140 |
Add blocks under/Block to add?
141 |
142 | Here you can pick the block that will be put under either important blocks (eg carpets, sand, pressure plates) or all blocks. This block will also be
143 | used for the noobline, which cannot be disabled.
144 |
145 |
146 |
Presets?
147 |
148 | You can use presets to save and load block configurations. Pick your blocks and click "Save" to save them as a preset, pick a preset to load it and
149 | click "Delete" to delete the loaded preset. It is also possible to share a link for your preset with others.
150 |
151 |
152 |
Custom Blocks
153 |
Custom blocks can be added from the bottom of the blocks selection pane. Different versions of a block can be added for the same block name, eg for 1.12.2 and 1.13.2+. Some examples are provided in the 'examples' section. NBT tags / block states can be found on the Minecraft Wiki . To edit an existing custom block, select it, edit the tags / versions etc, and then click the 'add' button to overwrite. Note that presets URLs do not support custom blocks.
154 |
155 |
156 |
157 |
158 |
159 | );
160 | }
161 |
162 | export default FAQ;
163 |
--------------------------------------------------------------------------------
/src/components/header.css:
--------------------------------------------------------------------------------
1 | .contactInfoBlurred {
2 | filter: blur(0.5em);
3 | cursor: pointer;
4 | }
5 |
6 | .FAQTextButton {
7 | color: var(--rebaneGreen);
8 | cursor: pointer;
9 | text-decoration: underline;
10 | }
11 |
--------------------------------------------------------------------------------
/src/components/header.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 | import { Link } from "react-router-dom";
3 |
4 | import "./header.css";
5 |
6 | class Header extends Component {
7 | state = { contactInfoClassname: "contactInfoBlurred" };
8 |
9 | // Reveal contact info
10 | onContactInfoClick = (event) => {
11 | const { getLocaleString } = this.props;
12 | event.preventDefault();
13 | if (window.confirm(getLocaleString("FAQ/HAVE-YOU-READ"))) {
14 | alert(getLocaleString("FAQ/HELP-IN-ENGLISH"));
15 | this.setState({ contactInfoClassname: "contactInfo" });
16 | }
17 | };
18 |
19 | render() {
20 | const { contactInfoClassname } = this.state;
21 | const { getLocaleString } = this.props;
22 | return (
23 |
24 |
45 |
46 | {getLocaleString("DESCRIPTION/1")}
47 |
48 | 2b2t
49 |
50 | {getLocaleString("DESCRIPTION/2")}
51 |
52 | {getLocaleString("DESCRIPTION/3")}
53 |
54 | {getLocaleString("DESCRIPTION/4")}
55 |
56 | {getLocaleString("DESCRIPTION/5")}
57 |
58 | {getLocaleString("DESCRIPTION/6")}
59 |
60 | (rebane2001#3716)
61 |
62 | {getLocaleString("DESCRIPTION/7")}
63 |
64 | (
65 |
66 | /u/rebane2001
67 |
68 | )
69 |
70 | {getLocaleString("DESCRIPTION/8")}
71 |
72 | GitHub
73 |
74 | {"."}
75 |
76 |
77 | {getLocaleString("DESCRIPTION/9")}
78 |
79 | {getLocaleString("DESCRIPTION/10")}
80 |
81 | {"."}
82 |
83 |
84 |
85 | {getLocaleString("FAQ/PLEASE-READ-1")}
86 |
87 | {getLocaleString("FAQ/FAQ")}
88 |
89 | {getLocaleString("FAQ/PLEASE-READ-2")}
90 |
91 |
92 |
93 | );
94 | }
95 | }
96 |
97 | export default Header;
98 |
--------------------------------------------------------------------------------
/src/components/languages.css:
--------------------------------------------------------------------------------
1 | .languages {
2 | display: flex;
3 | flex-direction: row;
4 | flex-wrap: wrap;
5 | }
6 |
7 | .languages img {
8 | cursor: pointer;
9 | height: 50px;
10 | }
11 |
12 | .flag_et_pop {
13 | display: none;
14 | }
15 |
16 | .flag_et:hover {
17 | display: none;
18 | }
19 |
20 | .flag_et:hover + .flag_et_pop {
21 | display: initial;
22 | }
23 |
24 | .imgLoadingGif {
25 | position: absolute;
26 | }
27 |
--------------------------------------------------------------------------------
/src/components/languages.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 | import { Link } from "react-router-dom";
3 |
4 | import Locale from "../locale/locale";
5 |
6 | import "./languages.css";
7 |
8 | class Languages extends Component {
9 | render() {
10 | return (
11 |
12 | {Object.keys(Locale).map((language) => (
13 |
14 | {language === "et" ? (
15 |
16 |
17 |
18 |
19 |
20 |
21 | ) : (
22 |
23 |
24 |
25 | )}
26 |
27 | ))}
28 |
29 | );
30 | }
31 | }
32 |
33 | export default Languages;
34 |
--------------------------------------------------------------------------------
/src/components/mapart/autoCompleteInputBlockToAdd/autoCompleteInputBlockToAdd.css:
--------------------------------------------------------------------------------
1 | .blockToAddSuggestions {
2 | position: absolute;
3 | z-index: 50;
4 | margin: 0;
5 | padding: 0;
6 | font-family: "kenpixel_mini_square";
7 | background: var(--rebaneGreen);
8 | color: white;
9 | }
10 |
11 | .blockToAddSuggestion th {
12 | font-weight: normal;
13 | padding: 0.2em;
14 | }
15 |
16 | .blockToAddSuggestion th:first-child {
17 | display: flex;
18 | justify-content: center;
19 | align-items: center;
20 | }
21 |
22 | .blockToAddSuggestion:hover {
23 | background-color: #609060;
24 | cursor: pointer;
25 | }
26 |
--------------------------------------------------------------------------------
/src/components/mapart/autoCompleteInputBlockToAdd/autoCompleteInputBlockToAdd.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 |
3 | import BlockImage from "../blockImage";
4 |
5 | import "./autoCompleteInputBlockToAdd.css";
6 |
7 | class AutoCompleteInputBlockToAdd extends Component {
8 | state = { suggestionSelected: true };
9 |
10 | getRelevantSuggestions = () => {
11 | const { coloursJSON, value, optionValue_version } = this.props;
12 | let suggestions_prefix = [];
13 | let suggestions_includes = [];
14 |
15 | for (const [colourSetId, colourSet] of Object.entries(coloursJSON)) {
16 | for (const [blockId, block] of Object.entries(colourSet.blocks)) {
17 | if (!(optionValue_version.MCVersion in block.validVersions)) {
18 | continue;
19 | }
20 | let blockNBTData = block.validVersions[optionValue_version.MCVersion];
21 | if (typeof blockNBTData === "string") {
22 | // this is of the form eg "&1.12.2"
23 | blockNBTData = block.validVersions[blockNBTData.slice(1)];
24 | }
25 | if (!block.supportBlockMandatory) {
26 | // no gravity affected blocks etc for support / noobline
27 | if (blockNBTData.NBTName.startsWith(value)) {
28 | suggestions_prefix.push({
29 | blockName: blockNBTData.NBTName,
30 | colourSetId,
31 | blockId,
32 | });
33 | } else if (blockNBTData.NBTName.includes(value)) {
34 | suggestions_includes.push({
35 | blockName: blockNBTData.NBTName,
36 | colourSetId,
37 | blockId,
38 | });
39 | }
40 | }
41 | }
42 | }
43 | return suggestions_prefix.concat(suggestions_includes);
44 | };
45 |
46 | handleTextChange = (e) => {
47 | const newValue = e.target.value.replace(" ", "_").toLowerCase();
48 | this.props.setValue(newValue);
49 | };
50 |
51 | onSuggestionClicked = (suggestion) => {
52 | this.props.setValue(suggestion.blockName);
53 | this.setState({ suggestionSelected: true });
54 | };
55 |
56 | onFocus = () => {
57 | this.setState({ suggestionSelected: false });
58 | };
59 |
60 | render() {
61 | const { coloursJSON, value } = this.props;
62 | const { suggestionSelected } = this.state;
63 |
64 | const relevantSuggestions = this.getRelevantSuggestions();
65 |
66 | return (
67 |
68 |
69 |
70 |
71 | {relevantSuggestions.map((suggestion) => (
72 | this.onSuggestionClicked(suggestion)}
76 | >
77 |
78 |
79 |
80 | {suggestion.blockName}
81 |
82 | ))}
83 |
84 |
85 |
86 | );
87 | }
88 | }
89 |
90 | export default AutoCompleteInputBlockToAdd;
91 |
--------------------------------------------------------------------------------
/src/components/mapart/blockImage.css:
--------------------------------------------------------------------------------
1 | .blockImage {
2 | width: 32px;
3 | height: 32px;
4 | margin-top: 3px;
5 | margin-bottom: 3px;
6 | margin-right: 3px;
7 | margin-left: 3px;
8 | background-color: #222222;
9 | transition: background-color 0.2s;
10 | }
11 |
--------------------------------------------------------------------------------
/src/components/mapart/blockImage.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 |
3 | import IMG_Null from "../../images/null.png";
4 | import IMG_Textures from "../../images/textures.png";
5 |
6 | import "./blockImage.css";
7 |
8 | class BlockImage extends Component {
9 | render() {
10 | const { getLocaleString, coloursJSON, colourSetId, blockId, style, className, ...props_others } = this.props;
11 | const isNone = blockId === "-1"; // if barrier / no block selected for colourSetId
12 | const isUnknown = colourSetId === "64" && blockId === "2"; // if unknown / placeholder block
13 | return (
14 |
56 | );
57 | }
58 | }
59 |
60 | export default BlockImage;
61 |
--------------------------------------------------------------------------------
/src/components/mapart/blockSelection.css:
--------------------------------------------------------------------------------
1 | .colourSet {
2 | display: flex;
3 | flex-direction: row;
4 | }
5 |
6 | .colourSetBox {
7 | width: 24px;
8 | height: 24px;
9 | border: 1px solid rgba(0, 0, 0, 0.2);
10 | margin-top: 6px;
11 | margin-right: 3px;
12 | margin-left: 3px;
13 | flex-shrink: 0;
14 | }
15 |
16 | .colourSetBlocks {
17 | display: flex;
18 | flex-direction: row;
19 | flex-wrap: wrap;
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/mapart/blockSelectionAddCustom/blockSelectionAddCustom.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/components/mapart/blockSelectionAddCustom/blockSelectionAddCustom.css
--------------------------------------------------------------------------------
/src/components/mapart/bufferedNumberInput/bufferedNumberInput.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/components/mapart/bufferedNumberInput/bufferedNumberInput.css
--------------------------------------------------------------------------------
/src/components/mapart/bufferedNumberInput/bufferedNumberInput.js:
--------------------------------------------------------------------------------
1 | import { Component } from "react";
2 |
3 | import "./bufferedNumberInput.css";
4 |
5 | class BufferedNumberInput extends Component {
6 | state = { buffer: null };
7 |
8 | constructor(props) {
9 | super(props);
10 | this.state.buffer = props.value;
11 | }
12 |
13 | componentDidUpdate(prevProps) {
14 | const { value } = this.props;
15 | if (prevProps.value !== value) {
16 | this.setState({ buffer: value });
17 | }
18 | }
19 |
20 | onInputChange = (e) => {
21 | const { validators, onValidInput } = this.props;
22 | const newValue_buffer = e.target.value;
23 | const newValue_int = parseInt(newValue_buffer);
24 | this.setState({ buffer: newValue_buffer }, () => {
25 | if (
26 | validators.every((validator) => {
27 | return validator(newValue_int);
28 | })
29 | ) {
30 | onValidInput(newValue_int);
31 | }
32 | });
33 | };
34 |
35 | render() {
36 | const { min, max, step, style, disabled } = this.props;
37 | const { buffer } = this.state;
38 | return ;
39 | }
40 | }
41 |
42 | export default BufferedNumberInput;
43 |
--------------------------------------------------------------------------------
/src/components/mapart/greenButtons.css:
--------------------------------------------------------------------------------
1 | .greenButton {
2 | display: block;
3 | font-family: "kenpixel_mini_square";
4 | color: #333333;
5 | cursor: pointer;
6 | position: relative;
7 | width: 300px;
8 | margin-top: 0.1em;
9 | margin-bottom: 0.1em;
10 | }
11 |
12 | .greenButton_text {
13 | position: absolute;
14 | top: 0;
15 | left: 0;
16 | width: 100%;
17 | text-align: center;
18 |
19 | line-height: 29px;
20 | z-index: 10;
21 | }
22 |
23 | .greenButton_text_dummy {
24 | position: unset;
25 | visibility: hidden;
26 | width: 100%;
27 | text-align: center;
28 | display: block;
29 |
30 | line-height: 29px;
31 | z-index: 10;
32 | }
33 |
34 | .greenButton_large_text {
35 | position: absolute;
36 | top: 0;
37 | left: 0;
38 | width: 100%;
39 | text-align: center;
40 |
41 | line-height: 50px;
42 | z-index: 10;
43 | font-size: 26px ;
44 | }
45 |
46 | .greenButton_large_text_dummy {
47 | position: unset;
48 | visibility: hidden;
49 | width: 100%;
50 | text-align: center;
51 | display: block;
52 |
53 | line-height: 50px;
54 | z-index: 10;
55 | font-size: 26px ;
56 | }
57 |
58 | .greenButton_progressDiv {
59 | position: absolute;
60 | top: 0;
61 | left: 0;
62 | background-color: #688e6b;
63 | height: 100%;
64 | }
65 |
--------------------------------------------------------------------------------
/src/components/mapart/json/backgroundColourModes.json:
--------------------------------------------------------------------------------
1 | {
2 | "OFF": {
3 | "uniqueId": 0,
4 | "localeKey": "MAP-SETTINGS/PREPROCESSING/BACKGROUND/OFF"
5 | },
6 | "DITHERED": {
7 | "uniqueId": 1,
8 | "localeKey": "MAP-SETTINGS/PREPROCESSING/BACKGROUND/DITHERED"
9 | },
10 | "SMOOTH": {
11 | "uniqueId": 2,
12 | "localeKey": "MAP-SETTINGS/PREPROCESSING/BACKGROUND/SMOOTH"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/components/mapart/json/cropModes.json:
--------------------------------------------------------------------------------
1 | {
2 | "OFF": {
3 | "uniqueId": 0,
4 | "localeKey": "MAP-SETTINGS/CROP/OFF"
5 | },
6 | "CENTER": {
7 | "uniqueId": 1,
8 | "localeKey": "MAP-SETTINGS/CROP/CENTER"
9 | },
10 | "MANUAL": {
11 | "uniqueId": 2,
12 | "localeKey": "MAP-SETTINGS/CROP/MANUAL"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/components/mapart/json/defaultPresets.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "Everything",
4 | "localeKey": "BLOCK-SELECTION/PRESETS/EVERYTHING",
5 | "blocks": [
6 | [0, 0],
7 | [1, 0],
8 | [2, 0],
9 | [3, 0],
10 | [4, 0],
11 | [5, 0],
12 | [6, 0],
13 | [7, 0],
14 | [8, 0],
15 | [9, 0],
16 | [10, 0],
17 | [11, 0],
18 | [12, 0],
19 | [13, 0],
20 | [14, 0],
21 | [15, 0],
22 | [16, 0],
23 | [17, 0],
24 | [18, 0],
25 | [19, 0],
26 | [20, 0],
27 | [21, 0],
28 | [22, 0],
29 | [23, 0],
30 | [24, 0],
31 | [25, 0],
32 | [26, 0],
33 | [27, 0],
34 | [28, 0],
35 | [29, 0],
36 | [30, 0],
37 | [31, 0],
38 | [32, 0],
39 | [33, 0],
40 | [34, 0],
41 | [35, 0],
42 | [36, 0],
43 | [37, 0],
44 | [38, 0],
45 | [39, 0],
46 | [40, 0],
47 | [41, 0],
48 | [42, 0],
49 | [43, 0],
50 | [44, 0],
51 | [45, 0],
52 | [46, 0],
53 | [47, 0],
54 | [48, 0],
55 | [49, 0],
56 | [50, 0],
57 | [51, 0],
58 | [52, 0],
59 | [53, 0],
60 | [54, 0],
61 | [55, 0],
62 | [56, 0],
63 | [57, 0],
64 | [58, 0],
65 | [59, 0],
66 | [60, 0]
67 | ]
68 | },
69 | {
70 | "name": "Carpets",
71 | "localeKey": "BLOCK-SELECTION/PRESETS/CARPETS",
72 | "blocks": [
73 | [13, 1],
74 | [14, 1],
75 | [15, 1],
76 | [16, 1],
77 | [17, 1],
78 | [18, 1],
79 | [19, 1],
80 | [20, 1],
81 | [21, 1],
82 | [22, 1],
83 | [23, 1],
84 | [24, 1],
85 | [25, 1],
86 | [26, 1],
87 | [27, 1],
88 | [28, 1]
89 | ]
90 | },
91 | {
92 | "name": "Greyscale",
93 | "localeKey": "BLOCK-SELECTION/PRESETS/GREYSCALE",
94 | "blocks": [
95 | [2, 0],
96 | [5, 0],
97 | [7, 0],
98 | [9, 0],
99 | [12, 0],
100 | [13, 0],
101 | [20, 0],
102 | [21, 0],
103 | [28, 0],
104 | [58, 0]
105 | ]
106 | }
107 | ]
108 |
--------------------------------------------------------------------------------
/src/components/mapart/json/ditherMethods.json:
--------------------------------------------------------------------------------
1 | {
2 | "None": {
3 | "uniqueId": 0,
4 | "name": "None",
5 | "localeKey": "MAP-SETTINGS/DITHERING/NONE"
6 | },
7 | "FloydSteinberg": {
8 | "uniqueId": 1,
9 | "name": "Floyd-Steinberg",
10 | "ditherMatrix": [
11 | [0, 0, 0, 7.0, 0],
12 | [0, 3.0, 5.0, 1.0, 0],
13 | [0, 0, 0, 0, 0]
14 | ],
15 | "ditherDivisor": 16.0
16 | },
17 | "Bayer44": {
18 | "uniqueId": 2,
19 | "name": "Bayer (4x4)",
20 | "ditherMatrix": [
21 | [1, 9, 3, 11],
22 | [13, 5, 15, 7],
23 | [4, 12, 2, 10],
24 | [16, 8, 14, 6]
25 | ]
26 | },
27 | "Bayer22": {
28 | "uniqueId": 3,
29 | "name": "Bayer (2x2)",
30 | "ditherMatrix": [
31 | [1, 3],
32 | [4, 2]
33 | ]
34 | },
35 | "Ordered33": {
36 | "uniqueId": 4,
37 | "name": "Ordered (3x3)",
38 | "ditherMatrix": [
39 | [1, 7, 4],
40 | [5, 8, 3],
41 | [6, 2, 9]
42 | ]
43 | },
44 | "MinAvgErr": {
45 | "uniqueId": 5,
46 | "name": "MinAvgErr",
47 | "ditherMatrix": [
48 | [0, 0, 0, 7.0, 5.0],
49 | [3.0, 5.0, 7.0, 5.0, 3.0],
50 | [1.0, 3.0, 5.0, 3.0, 1.0]
51 | ],
52 | "ditherDivisor": 48.0
53 | },
54 | "Burkes": {
55 | "uniqueId": 6,
56 | "name": "Burkes",
57 | "ditherMatrix": [
58 | [0.0, 0.0, 0.0, 8.0, 4.0],
59 | [2.0, 4.0, 8.0, 4.0, 2.0],
60 | [0.0, 0.0, 0.0, 0.0, 0.0]
61 | ],
62 | "ditherDivisor": 32.0
63 | },
64 | "SierraLite": {
65 | "uniqueId": 7,
66 | "name": "Sierra-Lite",
67 | "ditherMatrix": [
68 | [0, 0, 0, 2.0, 0],
69 | [0, 1.0, 1.0, 0, 0],
70 | [0, 0, 0, 0, 0]
71 | ],
72 | "ditherDivisor": 4.0
73 | },
74 | "Stucki": {
75 | "uniqueId": 8,
76 | "name": "Stucki",
77 | "ditherMatrix": [
78 | [0, 0, 0, 8.0, 4.0],
79 | [2.0, 4.0, 8.0, 4.0, 2.0],
80 | [1.0, 2.0, 4.0, 2.0, 1.0]
81 | ],
82 | "ditherDivisor": 42.0
83 | },
84 | "Atkinson": {
85 | "uniqueId": 9,
86 | "name": "Atkinson",
87 | "ditherMatrix": [
88 | [0, 0, 0, 1.0, 1.0],
89 | [0, 1.0, 1.0, 1.0, 0],
90 | [0, 0, 1.0, 0, 0]
91 | ],
92 | "ditherDivisor": 8.0
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/src/components/mapart/json/mapModes.json:
--------------------------------------------------------------------------------
1 | {
2 | "SCHEMATIC_NBT": {
3 | "uniqueId": 0,
4 | "name": "Schematic (NBT)",
5 | "staircaseModes": {
6 | "OFF": {
7 | "uniqueId": 0,
8 | "localeKey": "MAP-SETTINGS/3D/OFF",
9 | "toneKeys": ["normal"],
10 | "extra": false
11 | },
12 | "CLASSIC": {
13 | "uniqueId": 1,
14 | "localeKey": "MAP-SETTINGS/3D/CLASSIC",
15 | "toneKeys": ["dark", "normal", "light"],
16 | "extra": false
17 | },
18 | "VALLEY": {
19 | "uniqueId": 2,
20 | "localeKey": "MAP-SETTINGS/3D/VALLEY",
21 | "toneKeys": ["dark", "normal", "light"],
22 | "extra": false
23 | },
24 | "FULL_DARK": {
25 | "uniqueId": 3,
26 | "localeKey": "MAP-SETTINGS/3D/FULL-DARK",
27 | "toneKeys": ["dark"],
28 | "extra": true
29 | },
30 | "FULL_LIGHT": {
31 | "uniqueId": 4,
32 | "localeKey": "MAP-SETTINGS/3D/FULL-LIGHT",
33 | "toneKeys": ["light"],
34 | "extra": true
35 | }
36 | }
37 | },
38 | "MAPDAT": {
39 | "uniqueId": 1,
40 | "name": "Datafile (map.dat)",
41 | "staircaseModes": {
42 | "OFF": {
43 | "uniqueId": 5,
44 | "localeKey": "MAP-SETTINGS/3D/OFF",
45 | "toneKeys": ["normal"],
46 | "extra": false
47 | },
48 | "ON": {
49 | "uniqueId": 6,
50 | "localeKey": "MAP-SETTINGS/3D/ON",
51 | "toneKeys": ["dark", "normal", "light"],
52 | "extra": false
53 | },
54 | "ON_UNOBTAINABLE": {
55 | "uniqueId": 7,
56 | "localeKey": "MAP-SETTINGS/3D/ON-UNOBTAINABLE",
57 | "toneKeys": ["dark", "normal", "light", "unobtainable"],
58 | "extra": false
59 | },
60 | "FULL_DARK": {
61 | "uniqueId": 8,
62 | "localeKey": "MAP-SETTINGS/3D/FULL-DARK",
63 | "toneKeys": ["dark"],
64 | "extra": true
65 | },
66 | "FULL_LIGHT": {
67 | "uniqueId": 9,
68 | "localeKey": "MAP-SETTINGS/3D/FULL-LIGHT",
69 | "toneKeys": ["light"],
70 | "extra": true
71 | },
72 | "FULL_UNOBTAINABLE": {
73 | "uniqueId": 10,
74 | "localeKey": "MAP-SETTINGS/3D/FULL-UNOBTAINABLE",
75 | "toneKeys": ["unobtainable"],
76 | "extra": true
77 | }
78 | }
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/src/components/mapart/json/supportedVersions.json:
--------------------------------------------------------------------------------
1 | {
2 | "1_12_2": {
3 | "MCVersion": "1.12.2",
4 | "NBTVersion": 1343
5 | },
6 | "1_13_2": {
7 | "MCVersion": "1.13.2",
8 | "NBTVersion": 1631
9 | },
10 | "1_14_4": {
11 | "MCVersion": "1.14.4",
12 | "NBTVersion": 1976
13 | },
14 | "1_15_2": {
15 | "MCVersion": "1.15.2",
16 | "NBTVersion": 2230
17 | },
18 | "1_16_5": {
19 | "MCVersion": "1.16.5",
20 | "NBTVersion": 2586
21 | },
22 | "1_17_1": {
23 | "MCVersion": "1.17.1",
24 | "NBTVersion": 2730
25 | },
26 | "1_18_2": {
27 | "MCVersion": "1.18.2",
28 | "NBTVersion": 2975
29 | },
30 | "1_19": {
31 | "MCVersion": "1.19",
32 | "NBTVersion": 3105
33 | },
34 | "1_20": {
35 | "MCVersion": "1.20",
36 | "NBTVersion": 3463
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/components/mapart/json/whereSupportBlocksModes.json:
--------------------------------------------------------------------------------
1 | {
2 | "NONE": {
3 | "uniqueId": 0,
4 | "localeKey": "MAP-SETTINGS/NBT-SPECIFIC/WHERE-SUPPORT-BLOCKS/NONE"
5 | },
6 | "IMPORTANT": {
7 | "uniqueId": 1,
8 | "localeKey": "MAP-SETTINGS/NBT-SPECIFIC/WHERE-SUPPORT-BLOCKS/IMPORTANT"
9 | },
10 | "ALL_OPTIMIZED": {
11 | "uniqueId": 2,
12 | "localeKey": "MAP-SETTINGS/NBT-SPECIFIC/WHERE-SUPPORT-BLOCKS/ALL-OPTIMIZED"
13 | },
14 | "ALL_DOUBLE_OPTIMIZED": {
15 | "uniqueId": 3,
16 | "localeKey": "MAP-SETTINGS/NBT-SPECIFIC/WHERE-SUPPORT-BLOCKS/ALL-DOUBLE-OPTIMIZED"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/components/mapart/mapPreview.css:
--------------------------------------------------------------------------------
1 | .imgUpload {
2 | display: none;
3 | }
4 |
5 | .gridOverlay {
6 | position: absolute;
7 | background-repeat: repeat;
8 | image-rendering: optimizeSpeed;
9 | image-rendering: -moz-crisp-edges;
10 | image-rendering: -webkit-optimize-contrast;
11 | image-rendering: -o-crisp-edges;
12 | image-rendering: pixelated;
13 | -ms-interpolation-mode: nearest-neighbor;
14 | pointer-events: none;
15 | }
16 |
17 | .mapCanvas {
18 | image-rendering: optimizeSpeed; /* Older versions of FF */
19 | image-rendering: -moz-crisp-edges; /* FF 6.0+ */
20 | image-rendering: -webkit-optimize-contrast; /* Safari */
21 | image-rendering: -o-crisp-edges; /* OS X & Windows Opera (12.02+) */
22 | image-rendering: pixelated; /* Awesome future-browsers */
23 | -ms-interpolation-mode: nearest-neighbor; /* IE */
24 | cursor: pointer;
25 | font-smooth: never;
26 | -webkit-font-smoothing: none;
27 | subpixel-antialias: none;
28 | }
29 |
30 | .mapResolutionAndZoom {
31 | display: flex;
32 | flex-direction: row;
33 | justify-content: space-between;
34 | }
35 |
36 | .sizeButton {
37 | margin-top: 2px;
38 | margin-left: 2px;
39 | width: 15px;
40 | height: 15px;
41 | cursor: pointer;
42 | }
43 |
44 | .progress {
45 | background-color: black;
46 | }
47 |
48 | .progressText {
49 | position: absolute;
50 | padding-left: 6px;
51 | }
52 |
53 | .progressDiv {
54 | background-color: #688e6b;
55 | height: 24px;
56 | }
57 |
--------------------------------------------------------------------------------
/src/components/mapart/mapSettings.css:
--------------------------------------------------------------------------------
1 | .settingsGroup {
2 | margin-block-start: 0.2em;
3 | margin-block-end: 0.2em;
4 | padding: 0.2em;
5 | outline: 0.1em solid white;
6 | }
7 |
--------------------------------------------------------------------------------
/src/components/mapart/mapartController.css:
--------------------------------------------------------------------------------
1 | .mapartController,
2 | .sectionsPreviewSettingsMaterials {
3 | display: flex;
4 | flex-direction: row;
5 | flex-wrap: wrap;
6 | justify-content: space-between;
7 | align-items: flex-start;
8 | }
9 |
10 | .sectionsPreviewSettingsMaterials {
11 | flex: 1;
12 | }
13 |
14 | .section {
15 | padding: 0.3em;
16 | }
17 |
--------------------------------------------------------------------------------
/src/components/mapart/materials.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/components/mapart/materials.css
--------------------------------------------------------------------------------
/src/components/mapart/materials.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 |
3 | import Tooltip from "../tooltip";
4 |
5 | import BlockImage from "./blockImage";
6 |
7 | import "./materials.css";
8 |
9 | class Materials extends Component {
10 | state = { onlyMaxPerSplit: false };
11 |
12 | onOnlyMaxPerSplitChange = () => {
13 | this.setState((currentState) => ({
14 | // nb this method of passing currentState instead of using this.state... is prefered; TODO neaten up controller uses
15 | onlyMaxPerSplit: !currentState.onlyMaxPerSplit,
16 | }));
17 | };
18 |
19 | getMaterialsCount_nonZeroMaterialsItems() {
20 | const { coloursJSON, currentMaterialsData } = this.props;
21 | const { onlyMaxPerSplit } = this.state;
22 | const materialsCount = {};
23 | for (const colourSetId of Object.keys(coloursJSON)) {
24 | materialsCount[colourSetId] = 0;
25 | }
26 | for (const row of currentMaterialsData.maps) {
27 | for (const map of row) {
28 | for (const [colourSetId, materialCount] of Object.entries(map.materials)) {
29 | if (onlyMaxPerSplit) {
30 | materialsCount[colourSetId] = Math.max(materialsCount[colourSetId], materialCount);
31 | } else {
32 | materialsCount[colourSetId] += materialCount;
33 | }
34 | }
35 | }
36 | }
37 | return Object.entries(materialsCount)
38 | .filter(([_, value]) => value !== 0)
39 | .sort((first, second) => {
40 | return second[1] - first[1];
41 | });
42 | }
43 |
44 | getMaterialsCount_supportBlock() {
45 | const { currentMaterialsData } = this.props;
46 | const { onlyMaxPerSplit } = this.state;
47 | let supportBlockCount = 0;
48 | currentMaterialsData.maps.forEach((row) => {
49 | row.forEach((map) => {
50 | const count = map.supportBlockCount;
51 | if (onlyMaxPerSplit) {
52 | supportBlockCount = Math.max(supportBlockCount, count);
53 | } else {
54 | supportBlockCount += count;
55 | }
56 | });
57 | });
58 | return supportBlockCount;
59 | }
60 |
61 | formatMaterialCount = (count) => {
62 | const numberOfStacks = Math.floor(count / 64);
63 | const remainder = count % 64;
64 | const numberOfShulkers = count / 1728;
65 | return `${count.toString()}${
66 | numberOfStacks !== 0
67 | ? ` (${numberOfStacks.toString()}x64${remainder !== 0 ? ` + ${remainder.toString()}` : ""}${
68 | numberOfShulkers >= 1 ? `, ${numberOfShulkers.toFixed(2)} SB` : ""
69 | })`
70 | : ""
71 | }`;
72 | };
73 |
74 | colourSetIdAndBlockIdFromNBTName(blockName) {
75 | const { coloursJSON, optionValue_version } = this.props;
76 | for (const [colourSetId, colourSet] of Object.entries(coloursJSON)) {
77 | for (const [blockId, block] of Object.entries(colourSet.blocks)) {
78 | if (!(optionValue_version.MCVersion in block.validVersions)) {
79 | continue;
80 | }
81 | let blockNBTData = block.validVersions[optionValue_version.MCVersion];
82 | if (typeof blockNBTData === "string") {
83 | // this is of the form eg "&1.12.2"
84 | blockNBTData = block.validVersions[blockNBTData.slice(1)];
85 | }
86 | if (
87 | Object.keys(blockNBTData.NBTArgs).length === 0 && // no exotic blocks for noobline
88 | blockName.toLowerCase() === blockNBTData.NBTName.toLowerCase()
89 | ) {
90 | return { colourSetId, blockId };
91 | }
92 | }
93 | }
94 | return null; // if block not found
95 | }
96 |
97 | render() {
98 | const { getLocaleString, coloursJSON, optionValue_supportBlock, currentMaterialsData } = this.props;
99 | const { onlyMaxPerSplit } = this.state;
100 | const nonZeroMaterialsItems = this.getMaterialsCount_nonZeroMaterialsItems();
101 | const supportBlockCount = this.getMaterialsCount_supportBlock();
102 | const supportBlockIds = this.colourSetIdAndBlockIdFromNBTName(optionValue_supportBlock);
103 | return (
104 |
105 |
{getLocaleString("MATERIALS/TITLE")}
106 |
107 |
108 | {getLocaleString("MATERIALS/SHOW-PER-SPLIT")}
109 | {":"}
110 |
111 | {" "}
112 |
113 |
114 |
115 |
116 |
117 | {getLocaleString("MATERIALS/BLOCK")}
118 | {getLocaleString("MATERIALS/AMOUNT")}
119 |
120 | {supportBlockCount !== 0 && (
121 |
122 |
123 |
124 |
130 |
131 |
132 | {this.formatMaterialCount(supportBlockCount)}
133 |
134 | )}
135 | {nonZeroMaterialsItems.map(([colourSetId, materialCount]) => {
136 | const blockId = currentMaterialsData.currentSelectedBlocks[colourSetId];
137 | return (
138 |
139 |
140 |
141 |
142 |
143 |
144 | {this.formatMaterialCount(materialCount)}
145 |
146 | );
147 | })}
148 |
149 |
150 |
151 | );
152 | }
153 | }
154 |
155 | export default Materials;
156 |
--------------------------------------------------------------------------------
/src/components/mapart/nbtReader.js:
--------------------------------------------------------------------------------
1 | /*
2 | A mapping from type names to NBT type numbers.
3 | This is NOT just an enum, these values have to stay as they are
4 | https://minecraft.wiki/w/NBT_format#TAG_definition
5 | */
6 | const TagTypes = {
7 | end: 0,
8 | byte: 1,
9 | short: 2,
10 | int: 3,
11 | long: 4,
12 | float: 5,
13 | double: 6,
14 | byteArray: 7,
15 | string: 8,
16 | list: 9,
17 | compound: 10,
18 | intArray: 11,
19 | longArray: 12,
20 | };
21 |
22 | class NBTReader {
23 | constructor() {
24 | if (typeof ArrayBuffer === "undefined") {
25 | throw new Error("Missing required type ArrayBuffer");
26 | }
27 | if (typeof DataView === "undefined") {
28 | throw new Error("Missing required type DataView");
29 | }
30 | if (typeof Uint8Array === "undefined") {
31 | throw new Error("Missing required type Uint8Array");
32 | }
33 | this.buffer = null;
34 | this.dataView = null;
35 | this.arrayView = null;
36 | this.offset = null;
37 | }
38 |
39 | loadBuffer(buffer) {
40 | this.buffer = buffer;
41 | this.dataView = new DataView(this.buffer);
42 | this.arrayView = new Uint8Array(this.buffer);
43 | this.offset = 0;
44 | }
45 |
46 | decodeUTF8(bytes) {
47 | let codepoints = [];
48 | for (let i = 0; i < bytes.length; i++) {
49 | const byte = bytes[i];
50 | if ((byte & 0x80) === 0) {
51 | // single byte 0x0001 to 0x007F
52 | codepoints.push(byte);
53 | } else if ((byte & 0xe0) === 0xc0) {
54 | // two bytes for 0x0000 and 0x0080 to 0x07FF
55 | codepoints.push(((byte & 0x1f) << 6) | (bytes[i + 1] & 0x3f));
56 | i += 1;
57 | } else if ((byte & 0xf0) === 0xe0) {
58 | // three bytes for 0x0800 to 0xFFFF
59 | codepoints.push(((byte & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f));
60 | i += 2;
61 | }
62 | }
63 | return String.fromCharCode.apply(null, codepoints);
64 | }
65 |
66 | read(dataType, size) {
67 | const value = this.dataView[`get${dataType}`](this.offset);
68 | this.offset += size;
69 | return value;
70 | }
71 |
72 | readByType(dataType) {
73 | switch (dataType) {
74 | case TagTypes.end: {
75 | return this.readByType(TagTypes.byte);
76 | }
77 | case TagTypes.byte: {
78 | return this.read("Int8", 1);
79 | }
80 | case TagTypes.short: {
81 | return this.read("Int16", 2);
82 | }
83 | case TagTypes.int: {
84 | return this.read("Int32", 4);
85 | }
86 | case TagTypes.long: {
87 | // NB: special: JS doesn't support native 64 bit ints; returns an array of two 32 bit ints
88 | return [this.readByType(TagTypes.int), this.readByType(TagTypes.int)];
89 | }
90 | case TagTypes.float: {
91 | return this.read("Float32", 4);
92 | }
93 | case TagTypes.double: {
94 | return this.read("Float64", 8);
95 | }
96 | case TagTypes.byteArray: {
97 | const arrayLength = this.readByType(TagTypes.int);
98 | const returnArray = this.arrayView.slice(this.offset, this.offset + arrayLength);
99 | this.offset += arrayLength;
100 | return returnArray;
101 | }
102 | case TagTypes.string: {
103 | const string_bytes_length = this.readByType(TagTypes.short);
104 | const string_bytes = this.arrayView.slice(this.offset, this.offset + string_bytes_length);
105 | this.offset += string_bytes_length;
106 | return this.decodeUTF8(string_bytes);
107 | }
108 | case TagTypes.list: {
109 | const list_objectType = this.readByType(TagTypes.byte);
110 | const list_length = this.readByType(TagTypes.int);
111 | let returnObject = { type: list_objectType, value: [] };
112 | for (let i = 0; i < list_length; i++) {
113 | returnObject.value.push(this.readByType(list_objectType));
114 | }
115 | return returnObject;
116 | }
117 | case TagTypes.compound: {
118 | let returnObject = {};
119 | while (true) {
120 | let tagType = this.readByType(TagTypes.byte);
121 | if (tagType === TagTypes.end) {
122 | break;
123 | } else {
124 | let key = this.readByType(TagTypes.string);
125 | let value = this.readByType(tagType);
126 | returnObject[key] = { type: tagType, value: value };
127 | }
128 | }
129 | return returnObject;
130 | }
131 | case TagTypes.intArray: {
132 | const returnArray = [];
133 | const array_length = this.readByType(TagTypes.int);
134 | for (let i = 0; i < array_length; i++) {
135 | returnArray.push(this.readByType(TagTypes.int));
136 | }
137 | return returnArray;
138 | }
139 | case TagTypes.longArray: {
140 | const returnArray = [];
141 | const array_length = this.readByType(TagTypes.int);
142 | for (let i = 0; i < array_length; i++) {
143 | returnArray.push(this.readByType(TagTypes.long));
144 | // NB this is an array of length 2 arrays of ints as specified in case:long
145 | }
146 | return returnArray;
147 | }
148 | default: {
149 | throw new Error(`Unknown data type ${dataType}`);
150 | }
151 | }
152 | }
153 |
154 | getData() {
155 | this.readByType(TagTypes.byte);
156 | return {
157 | name: this.readByType(TagTypes.string),
158 | value: this.readByType(TagTypes.compound),
159 | }; // NB this reads the top-level compound which does not have a terminating null byte
160 | }
161 | }
162 |
163 | export default NBTReader;
164 |
--------------------------------------------------------------------------------
/src/components/mapart/viewOnline2D/viewOnline2D.css:
--------------------------------------------------------------------------------
1 | .viewOnline2DContainer {
2 | position: fixed;
3 | z-index: 120;
4 | width: 100%;
5 | height: 100%;
6 | top: 0;
7 | left: 0;
8 | bottom: 0;
9 | right: 0;
10 | background-color: #7bae7f5e;
11 | }
12 |
13 | .viewOnline2DContainer .topBar {
14 | position: relative;
15 | z-index: 122;
16 | display: flex;
17 | flex-direction: row;
18 | justify-content: space-between;
19 | align-items: center;
20 | background-color: var(--rebaneGreen);
21 | }
22 |
23 | .viewOnline2DContainer .topBar * {
24 | z-index: 122;
25 | }
26 |
27 | .viewOnline2DContainer canvas {
28 | z-index: 121;
29 | image-rendering: optimizeSpeed; /* Older versions of FF */
30 | image-rendering: -moz-crisp-edges; /* FF 6.0+ */
31 | image-rendering: -webkit-optimize-contrast; /* Safari */
32 | image-rendering: -o-crisp-edges; /* OS X & Windows Opera (12.02+) */
33 | image-rendering: pixelated; /* Awesome future-browsers */
34 | -ms-interpolation-mode: nearest-neighbor; /* IE */
35 | }
36 |
--------------------------------------------------------------------------------
/src/components/mapart/viewOnline3D/pointerLockControls.js:
--------------------------------------------------------------------------------
1 | import { Euler, EventDispatcher, Vector3 } from "three";
2 |
3 | const _euler = new Euler(0, 0, 0, "YXZ");
4 | const _vector = new Vector3();
5 | const _vector_up = new Vector3(0, 1, 0);
6 |
7 | const _changeEvent = { type: "change" };
8 | const _lockEvent = { type: "lock" };
9 | const _unlockEvent = { type: "unlock" };
10 |
11 | const _PI_2 = Math.PI / 2;
12 |
13 | class PointerLockControls extends EventDispatcher {
14 | constructor(camera, domElement) {
15 | super();
16 |
17 | if (domElement === undefined) {
18 | console.warn('THREE.PointerLockControls: The second parameter "domElement" is now mandatory.');
19 | domElement = document.body;
20 | }
21 |
22 | this.domElement = domElement;
23 | this.isLocked = false;
24 |
25 | // Set to constrain the pitch of the camera
26 | // Range is 0 to Math.PI radians
27 | this.minPolarAngle = 0; // radians
28 | this.maxPolarAngle = Math.PI; // radians
29 |
30 | const scope = this;
31 |
32 | function onMouseMove(event) {
33 | if (scope.isLocked === false) return;
34 |
35 | const movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
36 | const movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
37 |
38 | _euler.setFromQuaternion(camera.quaternion);
39 |
40 | _euler.y -= movementX * 0.002;
41 | _euler.x -= movementY * 0.002;
42 |
43 | _euler.x = Math.max(_PI_2 - scope.maxPolarAngle, Math.min(_PI_2 - scope.minPolarAngle, _euler.x));
44 |
45 | camera.quaternion.setFromEuler(_euler);
46 |
47 | scope.dispatchEvent(_changeEvent);
48 | }
49 |
50 | function onPointerlockChange() {
51 | if (scope.domElement.ownerDocument.pointerLockElement === scope.domElement) {
52 | scope.dispatchEvent(_lockEvent);
53 |
54 | scope.isLocked = true;
55 | } else {
56 | scope.dispatchEvent(_unlockEvent);
57 |
58 | scope.isLocked = false;
59 | }
60 | }
61 |
62 | function onPointerlockError() {
63 | console.error("THREE.PointerLockControls: Unable to use Pointer Lock API");
64 | }
65 |
66 | this.connect = function () {
67 | scope.domElement.ownerDocument.addEventListener("mousemove", onMouseMove);
68 | scope.domElement.ownerDocument.addEventListener("pointerlockchange", onPointerlockChange);
69 | scope.domElement.ownerDocument.addEventListener("pointerlockerror", onPointerlockError);
70 | };
71 |
72 | this.disconnect = function () {
73 | scope.domElement.ownerDocument.removeEventListener("mousemove", onMouseMove);
74 | scope.domElement.ownerDocument.removeEventListener("pointerlockchange", onPointerlockChange);
75 | scope.domElement.ownerDocument.removeEventListener("pointerlockerror", onPointerlockError);
76 | };
77 |
78 | this.dispose = function () {
79 | this.disconnect();
80 | };
81 |
82 | this.getObject = function () {
83 | // retaining this method for backward compatibility
84 |
85 | return camera;
86 | };
87 |
88 | this.getDirection = (function () {
89 | const direction = new Vector3(0, 0, -1);
90 |
91 | return function (v) {
92 | return v.copy(direction).applyQuaternion(camera.quaternion);
93 | };
94 | })();
95 |
96 | this.moveForward = function (distance) {
97 | // move forward parallel to the xz-plane
98 | // assumes camera.up is y-up
99 |
100 | _vector.setFromMatrixColumn(camera.matrix, 0);
101 |
102 | _vector.crossVectors(camera.up, _vector);
103 |
104 | camera.position.addScaledVector(_vector, distance);
105 | };
106 |
107 | this.moveRight = function (distance) {
108 | _vector.setFromMatrixColumn(camera.matrix, 0);
109 |
110 | camera.position.addScaledVector(_vector, distance);
111 | };
112 |
113 | this.moveUp = function (distance) {
114 | camera.position.addScaledVector(_vector_up, distance);
115 | };
116 |
117 | this.lock = function () {
118 | this.domElement.requestPointerLock();
119 | };
120 |
121 | this.unlock = function () {
122 | scope.domElement.ownerDocument.exitPointerLock();
123 | };
124 |
125 | this.connect();
126 | }
127 | }
128 |
129 | export { PointerLockControls };
130 |
--------------------------------------------------------------------------------
/src/components/mapart/viewOnline3D/viewOnline3D.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/components/mapart/viewOnline3D/viewOnline3D.css
--------------------------------------------------------------------------------
/src/components/mapart/viewOnlineCommon/waila.css:
--------------------------------------------------------------------------------
1 | .viewOnline_waila {
2 | font-family: "kenpixel_mini_square";
3 | background: var(--rebaneGreen);
4 | color: white;
5 | padding: 0.3em;
6 | }
7 |
8 | .viewOnline_waila h3 {
9 | margin: 0;
10 | font-weight: normal;
11 | }
12 |
--------------------------------------------------------------------------------
/src/components/mapart/viewOnlineCommon/waila.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 |
3 | import BlockImage from "../blockImage";
4 |
5 | import "./waila.css";
6 |
7 | // What Am I Looking At
8 |
9 | class Waila extends Component {
10 | render() {
11 | const { getLocaleString, coloursJSON, selectedBlock, ...props_others } = this.props;
12 | return (
13 |
14 |
{`x: ${selectedBlock.x.toString()} y: ${selectedBlock.y.toString()} z: ${selectedBlock.z.toString()}`}
15 | {" "}
22 | {selectedBlock.colourSetId === 64 && selectedBlock.blockId === 2
23 | ? getLocaleString("MATERIALS/PLACEHOLDER-BLOCK-TT")
24 | : coloursJSON[selectedBlock.colourSetId.toString()].blocks[selectedBlock.blockId.toString()].displayName}
25 |
26 | );
27 | }
28 | }
29 |
30 | export default Waila;
31 |
--------------------------------------------------------------------------------
/src/components/root.css:
--------------------------------------------------------------------------------
1 | .titleAndLanguages {
2 | display: flex;
3 | flex-direction: row;
4 | justify-content: space-between;
5 | flex-wrap: wrap;
6 | }
7 |
8 | .fixedMessages {
9 | position: fixed;
10 | bottom: 0.1em;
11 | right: 0.1em;
12 | max-width: 20em;
13 | z-index: 200;
14 | }
15 |
16 | .fixedMessage {
17 | margin: 0.1em;
18 | padding: 0.3em;
19 | border: 0.1em solid var(--rebaneGreen);
20 | background-color: #333;
21 | }
22 |
23 | .fixedMessage p {
24 | margin: 0;
25 | }
26 |
27 | .fixedMessage button {
28 | width: 100%;
29 | }
30 |
--------------------------------------------------------------------------------
/src/components/root.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 |
3 | import Header from "./header";
4 | import Languages from "./languages";
5 | import MapartController from "./mapart/mapartController";
6 |
7 | import Locale from "../locale/locale";
8 |
9 | import "./root.css";
10 |
11 | class Root extends Component {
12 | state = {
13 | displayingCorruptedPresetWarning: false,
14 | displayingEdgeWarning: false,
15 | };
16 |
17 | constructor(props) {
18 | super(props);
19 |
20 | //show warning when using Edge
21 | if (!(/*@cc_on!@*/ (false || !!document["documentMode"])) && !!window["StyleMedia"]) {
22 | this.state.displayingEdgeWarning = true;
23 | }
24 | }
25 |
26 | getLocaleString = (stringName, languageCodeOverride) => {
27 | // languageCodeOverride only used inside this method for falling back to en
28 | const countryCode = languageCodeOverride !== undefined ? languageCodeOverride : this.props.match.params.countryCode;
29 | if (countryCode in Locale) {
30 | let stringSegments = stringName.split("/");
31 | const stringLast = stringSegments.pop();
32 | let folder = Locale[countryCode].strings;
33 | for (const stringSegment of stringSegments) {
34 | folder = folder[stringSegment];
35 | }
36 | if (folder[stringLast] === null) {
37 | // this could get stuck in an endless loop if the string does not exist in en;
38 | // en must always exist
39 | return this.getLocaleString(stringName, "en");
40 | } else {
41 | return folder[stringLast];
42 | }
43 | } else {
44 | return this.getLocaleString(stringName, "en");
45 | }
46 | };
47 |
48 | onEdgeWarningButtonClick = () => {
49 | this.setState({ displayingEdgeWarning: false });
50 | };
51 |
52 | onCorruptedPresetWarningButtonClick = () => {
53 | this.setState({ displayingCorruptedPresetWarning: false });
54 | };
55 |
56 | showCorruptedPresetWarning = () => {
57 | this.setState({ displayingCorruptedPresetWarning: true });
58 | };
59 |
60 | render() {
61 | const { displayingCorruptedPresetWarning, displayingEdgeWarning } = this.state;
62 | return (
63 |
64 |
65 | MapartCraft {this.props.match.params.countryCode && this.props.match.params.countryCode !== "en" && {this.getLocaleString("TRANSLATION/CREDITS")} }
66 |
67 |
68 |
69 |
70 |
71 | {displayingEdgeWarning ? (
72 |
73 |
{this.getLocaleString("EDGE-WARNING").replace("\\n", "\n")}
74 |
75 | ✔️
76 |
77 |
78 | ) : null}
79 | {displayingCorruptedPresetWarning ? (
80 |
81 |
{this.getLocaleString("BLOCK-SELECTION/PRESETS/IMPORT-ERROR-CORRUPTED")}
82 |
83 | ❗
84 |
85 |
86 | ) : null}
87 |
88 |
89 | );
90 | }
91 | }
92 |
93 | export default Root;
94 |
--------------------------------------------------------------------------------
/src/components/tooltip.css:
--------------------------------------------------------------------------------
1 | .tooltipContainer {
2 | display: inline-block;
3 | }
4 |
5 | .tooltipText {
6 | position: absolute;
7 | z-index: 100;
8 | margin: 0;
9 | padding: 0 0.3em 0.1em 0.3em;
10 | font-family: "kenpixel_mini_square";
11 | background: var(--rebaneGreen);
12 | color: white;
13 | font-weight: normal !important;
14 | }
15 |
--------------------------------------------------------------------------------
/src/components/tooltip.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 |
3 | import "./tooltip.css";
4 |
5 | class Tooltip extends Component {
6 | state = {
7 | hovering: false,
8 | };
9 |
10 | handleMouseOver = () => {
11 | this.setState({ hovering: true });
12 | };
13 |
14 | handleMouseOut = () => {
15 | this.setState({ hovering: false });
16 | };
17 |
18 | render() {
19 | const tooltipStyle = this.props.textStyleOverrides !== undefined
20 | ? {
21 | display: this.state.hovering ? "unset" : "none",
22 | ...this.props.textStyleOverrides,
23 | }
24 | : { display: this.state.hovering ? "unset" : "none" };
25 | return (
26 |
27 |
28 | {this.props.children}
29 |
30 |
31 | {this.props.tooltipText}
32 |
33 |
34 | );
35 | }
36 | }
37 |
38 | export default Tooltip;
39 |
--------------------------------------------------------------------------------
/src/cookieManager.js:
--------------------------------------------------------------------------------
1 | class CookieManager {
2 | static init() {
3 | // Handle cookie migration
4 | const cookieNames = ["presets", "mcversion", "customBlocks"];
5 | cookieNames.forEach(name => {
6 | if (this.getCookie(`mapartcraft_${name}`) === null && this.getCookie(name) !== null) {
7 | this.setCookie(`mapartcraft_${name}`, this.getCookie(name));
8 | }
9 | });
10 | }
11 |
12 | //Thx
13 | //https://www.w3schools.com/js/js_cookies.asp
14 | static setCookie(cname, cvalue) {
15 | let d = new Date();
16 | d.setTime(d.getTime() + 9000 * 24 * 60 * 60 * 1000);
17 | let expires = "expires=" + d.toUTCString();
18 | document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
19 | }
20 |
21 | static getCookie(cname) {
22 | let name = cname + "=";
23 | let ca = document.cookie.split(";");
24 | for (let i = 0; i < ca.length; i++) {
25 | let c = ca[i];
26 | while (c.charAt(0) === " ") {
27 | c = c.substring(1);
28 | }
29 | if (c.indexOf(name) === 0) {
30 | return c.substring(name.length, c.length);
31 | }
32 | }
33 | return null;
34 | }
35 |
36 | static touchCookie(cname, defaultValue) {
37 | const cookieValue = this.getCookie(cname);
38 | if (cookieValue !== null) {
39 | return cookieValue;
40 | } else {
41 | this.setCookie(cname, defaultValue);
42 | return defaultValue;
43 | }
44 | }
45 | }
46 |
47 | export default CookieManager;
48 |
--------------------------------------------------------------------------------
/src/images/Palette128_Unobtainable_Trans.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/images/Palette128_Unobtainable_Trans.png
--------------------------------------------------------------------------------
/src/images/classicVsValley.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/images/classicVsValley.png
--------------------------------------------------------------------------------
/src/images/gridOverlay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/images/gridOverlay.png
--------------------------------------------------------------------------------
/src/images/null.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/images/null.png
--------------------------------------------------------------------------------
/src/images/textures.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/images/textures.png
--------------------------------------------------------------------------------
/src/images/upload.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/images/upload.png
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --rebaneGreen: #7BAE7F;
3 | }
4 |
5 | @import url("https://fonts.googleapis.com/css?family=Open+Sans");
6 | @import url("https://fonts.googleapis.com/css?family=Lato");
7 |
8 | @font-face {
9 | font-family: "kenpixel_mini_square";
10 | src: url("./kenpixel_mini_square.woff") format("woff");
11 | }
12 |
13 | html {
14 | background-color: #333;
15 | }
16 |
17 | h1,
18 | h2 {
19 | margin: 0;
20 | }
21 |
22 | body {
23 | font-family: Lato, Open Sans, Arial;
24 | color: #fff;
25 | font-size: 16px;
26 | margin: auto auto;
27 | padding: 1em;
28 | line-height: 1.4;
29 | text-align: justify;
30 | }
31 |
32 | a,
33 | a:visited {
34 | color: var(--rebaneGreen);
35 | }
36 |
37 | [type="radio"] {
38 | position: absolute;
39 | opacity: 0;
40 | width: 0;
41 | height: 0;
42 | }
43 |
44 | table {
45 | border-collapse: collapse;
46 | }
47 |
48 | th:first-child {
49 | /* For tables in map settings to align with other settings */
50 | padding-left: 0;
51 | }
52 |
53 | .displayNone {
54 | display: none;
55 | }
56 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
4 |
5 | import FAQ from "./components/faq";
6 | import Root from "./components/root";
7 |
8 | import "./index.css";
9 |
10 | ReactDOM.render(
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | ,
19 | document.getElementById("root")
20 | );
21 |
--------------------------------------------------------------------------------
/src/kenpixel_mini_square.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/src/kenpixel_mini_square.woff
--------------------------------------------------------------------------------
/src/locale/de/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/locale/de/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "German",
4 | "CREDITS": "Übersetzung: Prismary, Number1Princess"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": null
8 | },
9 | "FAQ": {
10 | "FAQ": "FAQ",
11 | "PLEASE-READ-1": "Bitte lies das ",
12 | "PLEASE-READ-2": " bevor Du mich kontaktierst!",
13 | "HAVE-YOU-READ": "Hast Du das FAQ gelesen?",
14 | "HELP-IN-ENGLISH": "Hinweis: Hilfe kann ausschließlich auf Englisch bereitgestellt werden",
15 | "VIDEO-TUTORIAL": "Erklärvideo"
16 | },
17 | "DESCRIPTION": {
18 | "1": "Ein Generator zum Erstellen von Minecraft Mapart im Schematic und map.dat Format für sowohl Server-Admins, als auch Surival-Spieler auf Servern wie ",
19 | "2": ", innerhalb Deines Browsers",
20 | "3": "Inspiriert durch ",
21 | "4": "Redstonehelpers Mapart-Programm",
22 | "5": ", mit dem Ziel verschiedenste gewünschte Funktionen zu implementieren und das Programm online verfügbar zu machen.",
23 | "6": "Bei Rückfragen kannst Du mich auf Discord ",
24 | "7": " oder Reddit ",
25 | "8": " erreichen. Bug-Reports und Featurewünsche können auf GitHub eingereicht werden: ",
26 | "9": null,
27 | "10": null
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "Blockauswahl",
31 | "PRESETS": {
32 | "TITLE": "Vorlagen",
33 | "DELETE": "Entfernen",
34 | "DELETE-ERROR-DEFAULT": null,
35 | "SAVE": "Speichern",
36 | "SAVE-PROMPT-ENTER-NAME": "Gib einen Namen für Deine Vorlage ein:",
37 | "SHARE": "Teilen",
38 | "SHARE-TT": "Stellt die aktuelle Auswahl an Blöcken als Link bereit",
39 | "SHARE-WARNING-NONE-SELECTED": "Wähle vor dem Teilen Blöcke aus!",
40 | "SHARE-LINK": "Teile diesen Link, um deine aktuelle Auswahl an Blöcken zu teilen",
41 | "DOWNLOAD": "Download",
42 | "DOWNLOAD-TT": "Die Farbpalette für die Nutzung in paint.net herunterladen",
43 | "DOWNLOAD-WARNING-NONE-SELECTED": "Wähle vor dem Herunterladen der Palette Blöcke aus!",
44 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "Achtung, Deine Palette hat ",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-2": " Farben, während das Maximum in paint.net bei 96 liegt. Einige Farben werden in paint.net nicht verfügbar sein",
46 | "IMPORT-ERROR-CORRUPTED": "Der Link zur Vorlage ist beschädigt!",
47 | "NONE": "Nichts",
48 | "EVERYTHING": "Alles",
49 | "CARPETS": "Teppiche",
50 | "GREYSCALE": null,
51 | "DELETE-CONFIRM": null
52 | },
53 | "UNSUPPORTED-PAST": null,
54 | "ADD-CUSTOM": {
55 | "TITLE": null,
56 | "BLOCK-NAME": null,
57 | "NEEDS-SUPPORT": null,
58 | "FLAMMABLE": null,
59 | "VERSIONS": null,
60 | "COLOUR-SET": null,
61 | "NBT-TAGS": null,
62 | "ADD": null,
63 | "ERROR-NONE-SELECTED": null,
64 | "ERROR-NO-NAME": null,
65 | "EXAMPLES": null,
66 | "DELETE": "Entfernen",
67 | "NO-EXPORT": null
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "Map-Vorschau",
72 | "BEST-RESOLUTION-TT": "Ein Bild mit dieser Auflösung wird am besten funktionieren",
73 | "ASPECT-RATIO-MISMATCH-TT": "Das Bild stimmt nicht mit dem Seitenverhältnis der Map überein",
74 | "SCALE-MINUS-TT": "Vorschau verkleinern",
75 | "SCALE-PLUS-TT": "Vorschau vergrößern"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "Einstellungen",
79 | "MODE": "Format",
80 | "MODE-TT": "Bitte wähle ein Dateiformat",
81 | "MODE-VISUAL": "Visuell",
82 | "MODE-VISUAL-NA": "Visuell (nicht verfügbar)",
83 | "VERSION": "Version",
84 | "VERSION-TT": "Wähle die nächstgelegene Version zu der aus, auf welcher Du spielst.",
85 | "MAP-SIZE": "Maße",
86 | "CROP": {
87 | "TITLE": "Zuschneiden",
88 | "TITLE-TT": "Schneidet das Bild zurecht, statt es zu verzerren",
89 | "OFF": null,
90 | "CENTER": null,
91 | "MANUAL": null,
92 | "ZOOM": null
93 | },
94 | "GRID-OVERLAY": null,
95 | "GRID-OVERLAY-TT": null,
96 | "3D": {
97 | "TITLE": "Staircasing",
98 | "TITLE-TT": "Exportiert eine treppenartige, dreidimensionale Struktur. Schwieriger zu bauen, ermöglicht jedoch das Dreifache an Farben!",
99 | "OFF": "Aus (2D)",
100 | "CLASSIC": "An (klassisch)",
101 | "VALLEY": null,
102 | "FULL-DARK": null,
103 | "FULL-LIGHT": null,
104 | "ON": "An",
105 | "ON-UNOBTAINABLE": "An (Nicht erhältliche)",
106 | "FULL-UNOBTAINABLE": null
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "Platziere Blöcke unter",
111 | "NONE": "Keine Blöcke",
112 | "IMPORTANT": "Wichtige Blöcke",
113 | "ALL": "Alle Blöcke",
114 | "ALL-OPTIMIZED": "Alle Blöcke (optimiert)",
115 | "ALL-DOUBLE": "Alle Blöcke, doppelt",
116 | "ALL-DOUBLE-OPTIMIZED": "Alle Blöcke, doppelt (optimiert)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "Platzierter Block",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "Siehe vorherige Option"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "Nicht erhältliche Farben",
123 | "UNOBTAINABLE-COLOURS-TT": "Aktiviert map.dat exklusive Farben, die in Schematics nicht verfügbar sind",
124 | "TRANSPARENCY": null,
125 | "TRANSPARENCY-TT": null,
126 | "TRANSPARENCY-TOLERANCE": null,
127 | "MAPDAT-FILENAME-USE-ID": null,
128 | "MAPDAT-FILENAME-USE-ID-TT": null,
129 | "MAPDAT-FILENAME-ID-RANGE": null
130 | },
131 | "BETTER-COLOUR": "Verbesserte Farben",
132 | "BETTER-COLOUR-TT": "Aktiviert eine optimierte Farbgenauigkeit",
133 | "DITHERING": {
134 | "TITLE": "Dithering",
135 | "TITLE-TT": "Schafft die Illusion von mehr Farben durch das Hinzufügen scheinbar zufälliger Pixel",
136 | "NONE": "Aus"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": null,
140 | "ENABLE": null,
141 | "BRIGHTNESS": null,
142 | "CONTRAST": null,
143 | "SATURATION": null,
144 | "BACKGROUND": {
145 | "TITLE": null,
146 | "TITLE-TT": null,
147 | "OFF": null,
148 | "DITHERED": null,
149 | "SMOOTH": null
150 | },
151 | "BACKGROUND-COLOUR": null
152 | },
153 | "EXTRAS": {
154 | "TITLE": null,
155 | "MORE-STAIRCASING-OPTIONS": null,
156 | "MORE-STAIRCASING-OPTIONS-TT": null
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "Wähle vor dem Herunterladen Blöcke aus!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "DOWNLOAD",
163 | "DOWNLOAD-TT": "Die nbt-Datei herunterladen",
164 | "DOWNLOAD-SPLIT": "DOWNLOAD ALS 1x1 TEILE",
165 | "DOWNLOAD-SPLIT-TT": "Die nbt-Datei getrennt in 1x1 Teile herunterladen"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "DOWNLOAD",
169 | "DOWNLOAD-TT": "Die map.dat-Datei getrennt in 1x1 Teile herunterladen"
170 | },
171 | "ZIPPING": null
172 | },
173 | "MATERIALS": {
174 | "TITLE": "Materialien",
175 | "BLOCK": "Block",
176 | "AMOUNT": "Anzahl",
177 | "PLACEHOLDER-BLOCK-TT": "Platzhalter-Block",
178 | "SHOW-PER-SPLIT": "Nur maximale Materialienveränderung zeigen:",
179 | "SHOW-PER-SPLIT-TT": "Für Materialwiderverwertung bei feststellbaren Karten",
180 | "REFRESH-MATERIALS": "MATERIALIEN AKTUALISIEREN",
181 | "REFRESH-MATERIALS-TT": "Materialliste aktualisieren"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": null,
185 | "TITLE-TT": null,
186 | "TOO-BIG-FOR-SINGLE": null,
187 | "CONTROLS": null,
188 | "TO-EXIT": null,
189 | "SIZE": "Maße"
190 | },
191 | "DONATE": {
192 | "TITLE": "KLEINE SPENDE BITTE",
193 | "TITLE-TT": "Spendenlink und Liste aller Unterstützer"
194 | },
195 | "LITEMATICA-WARNING": null,
196 | "EDGE-WARNING": "Hinweis: Microsoft Edge wird nicht unterstützt.\\nBitte verwende Google Chrome (bevorzugt) oder Mozilla Firefox für MapartCraft",
197 | "NONE": "None",
198 | "UNUSED": {
199 | "SECOND": "Sekunde",
200 | "SECONDS": "Sekunden",
201 | "REMAINING": "verbleibend",
202 | "SETTINGS-3D-OPTIMIZED": "An (optimiert)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/src/locale/en/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/src/locale/en/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "English",
4 | "CREDITS": "Translated by: (Your Name Here)"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": "A Minecraft mapart schematic and map.dat generator"
8 | },
9 | "FAQ": {
10 | "FAQ": "FAQ",
11 | "PLEASE-READ-1": "Please check the ",
12 | "PLEASE-READ-2": " before asking any questions anywhere!",
13 | "HAVE-YOU-READ": "Have you read the FAQ?",
14 | "HELP-IN-ENGLISH": "Note: Help will only be provided in English",
15 | "VIDEO-TUTORIAL": "Video tutorial"
16 | },
17 | "DESCRIPTION": {
18 | "1": "A Minecraft mapart schematic and map.dat generator, designed to be feasible for both server admins and survival players on servers like ",
19 | "2": ", running in your browser.",
20 | "3": "Inspired by ",
21 | "4": "Redstonehelper's map art program",
22 | "5": ", with the goal to add much-requested features and removing the need to download a program.",
23 | "6": "Feel free to message me on Discord ",
24 | "7": " or Reddit ",
25 | "8": ". Feature requests and bug reports go on ",
26 | "9": "Note: MapartCraft has been updated to a shiny new version. If anything is broken, you can still use the ",
27 | "10": "classic version"
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "Block selection",
31 | "PRESETS": {
32 | "TITLE": "Presets",
33 | "DELETE": "Delete",
34 | "DELETE-CONFIRM": "Would you like to delete this preset:",
35 | "DELETE-ERROR-DEFAULT": "This is a default preset and can't be edited/deleted.",
36 | "SAVE": "Save",
37 | "SAVE-PROMPT-ENTER-NAME": "Enter a name for your preset:",
38 | "SHARE": "Share",
39 | "SHARE-TT": "Shares the blocks you have currently selected as a link",
40 | "SHARE-WARNING-NONE-SELECTED": "Select blocks before sharing them!",
41 | "SHARE-LINK": "Copy this link to share your currently selected blocks",
42 | "DOWNLOAD": "Export palette",
43 | "DOWNLOAD-TT": "Downloads color palette for use in Paint.NET",
44 | "DOWNLOAD-WARNING-NONE-SELECTED": "Select blocks before downloading palette!",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "Warning, your palette has ",
46 | "DOWNLOAD-WARNING-MAX-COLOURS-2": " colors, while the maximum in Paint.NET is 96. Some colors will be unavailable in Paint.NET",
47 | "IMPORT-ERROR-CORRUPTED": "Preset link is corrupted!",
48 | "NONE": "None",
49 | "EVERYTHING": "Everything",
50 | "CARPETS": "Carpets",
51 | "GREYSCALE": "Greyscale"
52 | },
53 | "UNSUPPORTED-PAST": "Unsupported past",
54 | "ADD-CUSTOM": {
55 | "TITLE": "Add Custom",
56 | "BLOCK-NAME": "Block Name",
57 | "NEEDS-SUPPORT": "Needs Support",
58 | "FLAMMABLE": "Flammable",
59 | "VERSIONS": "Versions",
60 | "COLOUR-SET": "Colour Set",
61 | "NBT-TAGS": "NBT Tags",
62 | "ADD": "Add",
63 | "ERROR-NONE-SELECTED": "Select version(s) before adding",
64 | "ERROR-NO-NAME": "Enter block name before adding",
65 | "EXAMPLES": "Examples",
66 | "DELETE": "Delete",
67 | "NO-EXPORT": "Note: Custom blocks will not be exported."
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "Map preview",
72 | "BEST-RESOLUTION-TT": "A source image with this resolution will work the best",
73 | "ASPECT-RATIO-MISMATCH-TT": "Image doesn't match map's aspect ratio",
74 | "SCALE-MINUS-TT": "Make preview smaller",
75 | "SCALE-PLUS-TT": "Make preview bigger"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "Settings",
79 | "MODE": "Mode",
80 | "MODE-TT": "Select the mode you'd like to operate in",
81 | "MODE-VISUAL": "Visual",
82 | "MODE-VISUAL-NA": "Visual (not available)",
83 | "VERSION": "Version",
84 | "VERSION-TT": "Select the version closest to what you're running",
85 | "MAP-SIZE": "Map size",
86 | "CROP": {
87 | "TITLE": "Crop",
88 | "TITLE-TT": "Crops your image instead of stretching it out",
89 | "OFF": "Off",
90 | "CENTER": "Center",
91 | "MANUAL": "Manual",
92 | "ZOOM": "Zoom"
93 | },
94 | "GRID-OVERLAY": "Grid",
95 | "GRID-OVERLAY-TT": "Overlays a grid that shows 16x16 chunks and 1x1 splits",
96 | "3D": {
97 | "TITLE": "Staircasing",
98 | "TITLE-TT": "Makes the map 3D. Harder to build, but 3 times the colors!",
99 | "OFF": "Off (2D)",
100 | "CLASSIC": "On (Classic)",
101 | "VALLEY": "On (Valley)",
102 | "FULL-DARK": "Full-Dark",
103 | "FULL-LIGHT": "Full-Light",
104 | "ON": "On",
105 | "ON-UNOBTAINABLE": "On (Unobtainable)",
106 | "FULL-UNOBTAINABLE": "Full-Unobtainable"
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "Add blocks under",
111 | "NONE": "No blocks",
112 | "IMPORTANT": "Important blocks",
113 | "ALL": "All blocks",
114 | "ALL-OPTIMIZED": "All blocks (optimized)",
115 | "ALL-DOUBLE": "All double",
116 | "ALL-DOUBLE-OPTIMIZED": "All double (optimized)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "Block to add",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "Related to previous option"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "Unobtainiable colors",
123 | "UNOBTAINABLE-COLOURS-TT": "Enables map.dat colors unobtainiable in schematics",
124 | "TRANSPARENCY": "Transparency",
125 | "TRANSPARENCY-TT": "Enables transparency for map.dat",
126 | "TRANSPARENCY-TOLERANCE": "Tolerance",
127 | "MAPDAT-FILENAME-USE-ID": "Numerical Filename",
128 | "MAPDAT-FILENAME-USE-ID-TT": "Save mapdats as 'map_#.dat'",
129 | "MAPDAT-FILENAME-ID-RANGE": "Range"
130 | },
131 | "BETTER-COLOUR": "Better color",
132 | "BETTER-COLOUR-TT": "Gives you better color accuracy",
133 | "DITHERING": {
134 | "TITLE": "Dithering",
135 | "TITLE-TT": "Adds seemingly random pixels for the illusion of more colors",
136 | "NONE": "None"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": "Image preprocessing",
140 | "ENABLE": "Enable",
141 | "BRIGHTNESS": "Brightness",
142 | "CONTRAST": "Contrast",
143 | "SATURATION": "Saturation",
144 | "BACKGROUND": {
145 | "TITLE": "Background",
146 | "TITLE-TT": "For images with transparency",
147 | "OFF": "Off",
148 | "DITHERED": "On (dithered)",
149 | "SMOOTH": "On (smooth)"
150 | },
151 | "BACKGROUND-COLOUR": "Colour"
152 | },
153 | "EXTRAS": {
154 | "TITLE": "Extras",
155 | "MORE-STAIRCASING-OPTIONS": "More Staircasing Options",
156 | "MORE-STAIRCASING-OPTIONS-TT": "Full-Dark, Full-Light, and Full-Unobtainable options"
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "Select blocks before downloading!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "DOWNLOAD NBT",
163 | "DOWNLOAD-TT": "Download the nbt",
164 | "DOWNLOAD-SPLIT": "DOWNLOAD AS 1x1 SPLIT",
165 | "DOWNLOAD-SPLIT-TT": "Download the nbt split into 1x1 chunks"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "DOWNLOAD MAPDAT",
169 | "DOWNLOAD-TT": "Download the map.dat split into 1x1 chunks"
170 | },
171 | "ZIPPING": "Zipping"
172 | },
173 | "MATERIALS": {
174 | "TITLE": "Materials",
175 | "BLOCK": "Block",
176 | "AMOUNT": "Amount",
177 | "PLACEHOLDER-BLOCK-TT": "Placeholder Block",
178 | "SHOW-PER-SPLIT": "Only show max mats per split",
179 | "SHOW-PER-SPLIT-TT": "For material reuse with locked maps",
180 | "REFRESH-MATERIALS": "REFRESH MATERIALS",
181 | "REFRESH-MATERIALS-TT": "Refresh materials list"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": "VIEW ONLINE",
185 | "TITLE-TT": "View the schematic online without downloading",
186 | "TOO-BIG-FOR-SINGLE": "Too big for single schematic; download 1x1 split",
187 | "CONTROLS": "Controls",
188 | "TO-EXIT": "To exit",
189 | "SIZE": "Size"
190 | },
191 | "DONATE": {
192 | "TITLE": "HELP ME SKIP THE QUEUE",
193 | "TITLE-TT": "View supporters and donate"
194 | },
195 | "LITEMATICA-WARNING": "Warning, Litematica does not support 1.15.2 very well; recommended action is to update to 1.16.5",
196 | "EDGE-WARNING": "Note: using Microsoft Edge is unsupported.\\nPlease use Chrome (preferred) or Firefox for MapartCraft",
197 | "NONE": "None",
198 | "UNUSED": {
199 | "SECOND": "second",
200 | "SECONDS": "seconds",
201 | "REMAINING": "remaining",
202 | "SETTINGS-3D-OPTIMIZED": "On (optimized)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/src/locale/eo/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/locale/eo/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "Esperanto",
4 | "CREDITS": "Traduko de: Ajno"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": null
8 | },
9 | "FAQ": {
10 | "FAQ": "OD",
11 | "PLEASE-READ-1": "Bonvolu vidi la ",
12 | "PLEASE-READ-2": "-n antaŭ ol demandi iun ie!",
13 | "HAVE-YOU-READ": "Ĉu vi legis la OD-n?",
14 | "HELP-IN-ENGLISH": "Atentu: Helpo estos provizita nur en la Angla",
15 | "VIDEO-TUTORIAL": "Videa instrukcio"
16 | },
17 | "DESCRIPTION": {
18 | "1": "Minecraft maparta generilo de schematic kaj map.dat, kreita por esti realigita por kaj servilaj administrantoj kaj travivaj ludantoj ĉe serviloj kiel ",
19 | "2": ", laborebla ĉe via retumilo",
20 | "3": "Inspirita de ",
21 | "4": "Redstonehelper's map art programo",
22 | "5": ", kun la celo por aldoni ofte petatajn apartaĵojn kaj forigi la neceson por enŝuti programon",
23 | "6": "Vi povas libere mesaĝi al mi per Discord ",
24 | "7": " aŭ Reddit ",
25 | "8": ", apartaĵajn petojn kaj cimraportojn sendu al ",
26 | "9": null,
27 | "10": null
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "Blokelektejo",
31 | "PRESETS": {
32 | "TITLE": "Ŝablonoj",
33 | "DELETE": "Forigi",
34 | "DELETE-ERROR-DEFAULT": null,
35 | "SAVE": "Konservi",
36 | "SAVE-PROMPT-ENTER-NAME": "Entajpu la nomon por la ŝablono:",
37 | "SHARE": "Dividi",
38 | "SHARE-TT": "Tio divideblas la nunelektitajn blokojn per ligilo",
39 | "SHARE-WARNING-NONE-SELECTED": "Elektu blokojn antaŭ ol dividi ilin!",
40 | "SHARE-LINK": "Dividu ĉi tiun ligilon por dividi viajn nunelektitajn blokojn",
41 | "DOWNLOAD": "Enŝuti",
42 | "DOWNLOAD-TT": "Enŝuti la koloraron por uzi en Paint.net",
43 | "DOWNLOAD-WARNING-NONE-SELECTED": "Elektu blokojn antaŭ ol enŝuti koloraron!",
44 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "Averto, via koloraro enhavas ",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-2": " colorojn, sed la plejgranda koloraro en Paint.net enhaveblas 96. Iu koloroj estos maluzebla en Paint.net",
46 | "IMPORT-ERROR-CORRUPTED": "Ŝablonligilo estas rompiĝinta!",
47 | "NONE": "Nenio",
48 | "EVERYTHING": "Ĉio",
49 | "CARPETS": "Tapiŝoj",
50 | "GREYSCALE": null,
51 | "DELETE-CONFIRM": null
52 | },
53 | "UNSUPPORTED-PAST": null,
54 | "ADD-CUSTOM": {
55 | "TITLE": null,
56 | "BLOCK-NAME": null,
57 | "NEEDS-SUPPORT": null,
58 | "FLAMMABLE": null,
59 | "VERSIONS": null,
60 | "COLOUR-SET": null,
61 | "NBT-TAGS": null,
62 | "ADD": null,
63 | "ERROR-NONE-SELECTED": null,
64 | "ERROR-NO-NAME": null,
65 | "EXAMPLES": null,
66 | "DELETE": "Forigi",
67 | "NO-EXPORT": null
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "Mapa antaŭvido",
72 | "BEST-RESOLUTION-TT": "Origina bildo kun ĉi tia amplekso laboros la plej bone",
73 | "ASPECT-RATIO-MISMATCH-TT": "Bildo ne sekvas la flankproporcion de mapo",
74 | "SCALE-MINUS-TT": "Malpligrandigi la antaŭvidon",
75 | "SCALE-PLUS-TT": "Pligrandigi la antaŭvidon"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "Agordoj",
79 | "MODE": "Reĝimo",
80 | "MODE-TT": "Elektu la reĝimon, en kiu vi volus operacii",
81 | "MODE-VISUAL": "Vida",
82 | "MODE-VISUAL-NA": "Vida (ne uzebla)",
83 | "VERSION": "Versio",
84 | "VERSION-TT": "Elektu la version la plej proksiman al versio, ĉe kiu vi ludas",
85 | "MAP-SIZE": "Mapa amplekso",
86 | "CROP": {
87 | "TITLE": "Ĉirkaŭtranĉi",
88 | "TITLE-TT": "Ĉirkaŭtranĉi vian bildon anstataŭ plilarĝigi ĝin",
89 | "OFF": null,
90 | "CENTER": null,
91 | "MANUAL": null,
92 | "ZOOM": null
93 | },
94 | "GRID-OVERLAY": null,
95 | "GRID-OVERLAY-TT": null,
96 | "3D": {
97 | "TITLE": "Ŝtupigado",
98 | "TITLE-TT": "Tio igas la mapon 3D. Estas pli malfacile por konstrui sed triobligas la kvanton de eblaj koloroj!",
99 | "OFF": "Malŝaltita (2D)",
100 | "CLASSIC": "Ŝaltita (klasika)",
101 | "VALLEY": null,
102 | "FULL-DARK": null,
103 | "FULL-LIGHT": null,
104 | "ON": "Ŝaltita",
105 | "ON-UNOBTAINABLE": "Ŝaltita (Malakireblaj)",
106 | "FULL-UNOBTAINABLE": null
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "Aldoni subblokojn",
111 | "NONE": "Sen blokoj",
112 | "IMPORTANT": "Uzendaj blokoj",
113 | "ALL": "Ĉiuj blokoj",
114 | "ALL-OPTIMIZED": "Ĉiuj blokoj (optimumigita)",
115 | "ALL-DOUBLE": "Ĉiuj duope",
116 | "ALL-DOUBLE-OPTIMIZED": "Ĉiuj duope (optimumigita)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "Bloko por aldoni",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "Rilatas al la antaŭa opcio"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "Malakireblaj koloroj",
123 | "UNOBTAINABLE-COLOURS-TT": "Tio ŝaltas kolorojn de map.dat malakireblajn en schematic-j",
124 | "TRANSPARENCY": null,
125 | "TRANSPARENCY-TT": null,
126 | "TRANSPARENCY-TOLERANCE": null,
127 | "MAPDAT-FILENAME-USE-ID": null,
128 | "MAPDAT-FILENAME-USE-ID-TT": null,
129 | "MAPDAT-FILENAME-ID-RANGE": null
130 | },
131 | "BETTER-COLOUR": "Pli bona koloro",
132 | "BETTER-COLOUR-TT": "Tio igas pli bonan kolorakuratecon",
133 | "DITHERING": {
134 | "TITLE": "Konfuzado",
135 | "TITLE-TT": "Tio aldonas ŝajne hazardajn rastrumerojn por iluzio de pli multe da koloroj",
136 | "NONE": "Nula"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": null,
140 | "ENABLE": null,
141 | "BRIGHTNESS": null,
142 | "CONTRAST": null,
143 | "SATURATION": null,
144 | "BACKGROUND": {
145 | "TITLE": null,
146 | "TITLE-TT": null,
147 | "OFF": null,
148 | "DITHERED": null,
149 | "SMOOTH": null
150 | },
151 | "BACKGROUND-COLOUR": null
152 | },
153 | "EXTRAS": {
154 | "TITLE": null,
155 | "MORE-STAIRCASING-OPTIONS": null,
156 | "MORE-STAIRCASING-OPTIONS-TT": null
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "Elektu blokojn antaŭ enŝutado!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "ENŜUTI",
163 | "DOWNLOAD-TT": "Enŝuti la nbt-n",
164 | "DOWNLOAD-SPLIT": "ENŜUTI KIEL 1x1 DIVIDAĴOJ",
165 | "DOWNLOAD-SPLIT-TT": "Enŝuti la nbt-n dividitan laŭ 1x1 pecoj"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "ENŜUTI",
169 | "DOWNLOAD-TT": "Enŝuti la map.dat-n dividitan laŭ 1x1 pecoj"
170 | },
171 | "ZIPPING": null
172 | },
173 | "MATERIALS": {
174 | "TITLE": "Materialoj",
175 | "BLOCK": "Bloko",
176 | "AMOUNT": "Kvanto",
177 | "PLACEHOLDER-BLOCK-TT": "Anstataŭbloko",
178 | "SHOW-PER-SPLIT": null,
179 | "SHOW-PER-SPLIT-TT": null,
180 | "REFRESH-MATERIALS": "ĜISDATIGI MATERIALOJN",
181 | "REFRESH-MATERIALS-TT": "Ĝisdatigi materialan liston"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": null,
185 | "TITLE-TT": null,
186 | "TOO-BIG-FOR-SINGLE": null,
187 | "CONTROLS": null,
188 | "TO-EXIT": null,
189 | "SIZE": "Amplekso"
190 | },
191 | "DONATE": {
192 | "TITLE": "HELPU MIN PASI LA VICON",
193 | "TITLE-TT": "Montri subtenintojn kaj mondonaci"
194 | },
195 | "LITEMATICA-WARNING": "Atentu: Se vi uzas Litematica-n 1.15.2, bonvolu uzi la 1.15 version\\nLitematica ŝajnas iel havi cimon se vi elektas alian version",
196 | "EDGE-WARNING": "Atentu: uzado de Microsoft Edge estas malsubtenata.\\nBonvolu uzi Chrome-n (prefere) aŭ Firefox-n por MapartCraft",
197 | "NONE": "Nula",
198 | "UNUSED": {
199 | "SECOND": "sekundo",
200 | "SECONDS": "sekundoj",
201 | "REMAINING": "restas",
202 | "SETTINGS-3D-OPTIMIZED": "Ŝaltita (optimumigita)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/src/locale/es/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/locale/et/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/locale/et/flag_pop.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/src/locale/et/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "Estonian",
4 | "CREDITS": "Tõlge: popstonia"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": "Minecrafti kaardikunsti schematic'u ja map.dat failide generaator."
8 | },
9 | "FAQ": {
10 | "FAQ": "KKK",
11 | "PLEASE-READ-1": "Palun lugege ",
12 | "PLEASE-READ-2": " enne küsimuste küsimist!",
13 | "HAVE-YOU-READ": "Kas sa oled lugenud KKK?",
14 | "HELP-IN-ENGLISH": "Märkus: Abi pakutakse vaid inglise ja eesti keeles",
15 | "VIDEO-TUTORIAL": "Videoõpetus"
16 | },
17 | "DESCRIPTION": {
18 | "1": "Minecrafti kaardikunsti schematic'u ja map.dat failide generaator, loodud nii serveri administraatorite kui ka survival serverite jaoks, nagu ",
19 | "2": ", jooksmas sinu brauseris",
20 | "3": "Inspireeritud ",
21 | "4": "Redstonehelperi kaardikunsti programmi",
22 | "5": " põhjal, eesmärgiga lisada paljunõutud lisavõimalusi ning eemaldada vajadus programmi alla laadida",
23 | "6": "Võite minuga ühedust võtta Discordi ",
24 | "7": " või Redditi ",
25 | "8": " kaudu, lisavõimaluste taotlused ning putukad lähevad ",
26 | "9": null,
27 | "10": null
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "Plokkide valik",
31 | "PRESETS": {
32 | "TITLE": "Eelseadistused",
33 | "DELETE": "Kustuta",
34 | "DELETE-ERROR-DEFAULT": "See on tehaseseadistus mida ei anna muuta/kustutada.",
35 | "SAVE": "Salvesta",
36 | "SAVE-PROMPT-ENTER-NAME": "Vali nimi oma eelseadistustele:",
37 | "SHARE": "Jaga",
38 | "SHARE-TT": "Jagab praegu valitud plokke lingina",
39 | "SHARE-WARNING-NONE-SELECTED": "Vali plokid enne jagamist!",
40 | "SHARE-LINK": "Jaga seda linki, et jagada oma praegu valitud plokke",
41 | "DOWNLOAD": "Lae",
42 | "DOWNLOAD-TT": "Laeb värvipaleti alla Paint.net'is kasutamiseks",
43 | "DOWNLOAD-WARNING-NONE-SELECTED": "Vali plokid enne paleti allalaadimist!",
44 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "Märkus, sinu palettis on ",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-2": " värvi, aga Paint.net\\'i maksimum on 96. Mõned värvid ei ole saadaval Paint.net\\'is",
46 | "IMPORT-ERROR-CORRUPTED": "Eelseadistuse link on katki!",
47 | "NONE": "Ei miskit",
48 | "EVERYTHING": "Kõik",
49 | "CARPETS": "Vaibad",
50 | "GREYSCALE": "Mustvalge",
51 | "DELETE-CONFIRM": null
52 | },
53 | "UNSUPPORTED-PAST": null,
54 | "ADD-CUSTOM": {
55 | "TITLE": null,
56 | "BLOCK-NAME": null,
57 | "NEEDS-SUPPORT": null,
58 | "FLAMMABLE": null,
59 | "VERSIONS": null,
60 | "COLOUR-SET": null,
61 | "NBT-TAGS": null,
62 | "ADD": null,
63 | "ERROR-NONE-SELECTED": null,
64 | "ERROR-NO-NAME": null,
65 | "EXAMPLES": null,
66 | "DELETE": "Kustuta",
67 | "NO-EXPORT": null
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "Kaardi eelvaade",
72 | "BEST-RESOLUTION-TT": "Sellise resolutsiooniga pilt töötab kõige paremini",
73 | "ASPECT-RATIO-MISMATCH-TT": "Pildi külgede suhe ei ühtu kaardi omaga",
74 | "SCALE-MINUS-TT": "Tee eelvaade väiksemaks",
75 | "SCALE-PLUS-TT": "Tee eelvaade suuremaks"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "Sätted",
79 | "MODE": "Režiim",
80 | "MODE-TT": "Vali režiim, milles soovid tegutseda",
81 | "MODE-VISUAL": "Visuaalne",
82 | "MODE-VISUAL-NA": "Visuaalne (pole saadaval)",
83 | "VERSION": "Versioon",
84 | "VERSION-TT": "Vali versioon, mis on lähim sellele, mida kasutad",
85 | "MAP-SIZE": "Kaardi suurus",
86 | "CROP": {
87 | "TITLE": "Pügamine",
88 | "TITLE-TT": "Pügab su pilti välja venitamise asemel",
89 | "OFF": null,
90 | "CENTER": null,
91 | "MANUAL": null,
92 | "ZOOM": null
93 | },
94 | "GRID-OVERLAY": "Ruudustik",
95 | "GRID-OVERLAY-TT": "Joonestab ruudustiku mis näitab 16x16 kamakaid ja 1x1 lõhestusi",
96 | "3D": {
97 | "TITLE": "Trepitamine",
98 | "TITLE-TT": "Teeb kaardi 3Dks. Raskem ehitada, kuid 3 korda rohkem värve!",
99 | "OFF": "Väljas (2D)",
100 | "CLASSIC": "Sees (klassikaline)",
101 | "VALLEY": null,
102 | "FULL-DARK": null,
103 | "FULL-LIGHT": null,
104 | "ON": "Sees",
105 | "ON-UNOBTAINABLE": "Sees (Saavutamatud)",
106 | "FULL-UNOBTAINABLE": null
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "Lisa plokid alla",
111 | "NONE": "Ära lisa",
112 | "IMPORTANT": "Tähtsad plokid",
113 | "ALL": "Kõik plokid",
114 | "ALL-OPTIMIZED": "Kõik plokid (optimiseeritud)",
115 | "ALL-DOUBLE": "Kõik topelt",
116 | "ALL-DOUBLE-OPTIMIZED": "Kõik topelt (optimiseeritud)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "Plokk, mida lisada",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "Seotud eelneva valikuga"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "Saavutamatud värvid",
123 | "UNOBTAINABLE-COLOURS-TT": "Lülitab sisse map.dat failid, mida schematic'utega ei saa",
124 | "TRANSPARENCY": "Läbipaistvus",
125 | "TRANSPARENCY-TT": "Lubab läbipaistvuse map.dat failidel",
126 | "TRANSPARENCY-TOLERANCE": null,
127 | "MAPDAT-FILENAME-USE-ID": null,
128 | "MAPDAT-FILENAME-USE-ID-TT": null,
129 | "MAPDAT-FILENAME-ID-RANGE": null
130 | },
131 | "BETTER-COLOUR": "Paremad värvid",
132 | "BETTER-COLOUR-TT": "Annab parema värvitäpsuse",
133 | "DITHERING": {
134 | "TITLE": "Värelemine",
135 | "TITLE-TT": "Lisab näiliselt suvalisi piksleid, tekitades illusiooni rohkematest värvidest",
136 | "NONE": "Puudub"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": "Pilditöötlus",
140 | "ENABLE": "Jah, tahan!",
141 | "BRIGHTNESS": "Heledus",
142 | "CONTRAST": "Kontrast",
143 | "SATURATION": "Küllastus",
144 | "BACKGROUND": {
145 | "TITLE": null,
146 | "TITLE-TT": null,
147 | "OFF": null,
148 | "DITHERED": null,
149 | "SMOOTH": null
150 | },
151 | "BACKGROUND-COLOUR": null
152 | },
153 | "EXTRAS": {
154 | "TITLE": null,
155 | "MORE-STAIRCASING-OPTIONS": null,
156 | "MORE-STAIRCASING-OPTIONS-TT": null
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "Vali plokid enne allalaadimist!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "LAE ALLA",
163 | "DOWNLOAD-TT": "Lae alla nbt",
164 | "DOWNLOAD-SPLIT": "LAE ALLA 1x1 KAMAKATENA",
165 | "DOWNLOAD-SPLIT-TT": "Lae alla nbt lõhestatuna 1x1 kamakateks"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "LAE ALLA",
169 | "DOWNLOAD-TT": "Lae alla map.dat lõhestatuna 1x1 kamakateks"
170 | },
171 | "ZIPPING": null
172 | },
173 | "MATERIALS": {
174 | "TITLE": "Materjalid",
175 | "BLOCK": "Plokk",
176 | "AMOUNT": "Kogus",
177 | "PLACEHOLDER-BLOCK-TT": "Kohatäite Plokk",
178 | "SHOW-PER-SPLIT": "Näita maksimaalseid materjale ühe lõhestuse kohta",
179 | "SHOW-PER-SPLIT-TT": "Materjalide taaskasutamiseks lukustatud kaartidega",
180 | "REFRESH-MATERIALS": "VÄRSKENDA MATERJALE",
181 | "REFRESH-MATERIALS-TT": "Värskenda materjalide listi"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": null,
185 | "TITLE-TT": null,
186 | "TOO-BIG-FOR-SINGLE": null,
187 | "CONTROLS": null,
188 | "TO-EXIT": null,
189 | "SIZE": "Suurus"
190 | },
191 | "DONATE": {
192 | "TITLE": "PÄÄSTA MIND JÄRJEKORRAST",
193 | "TITLE-TT": "Vaata toetajaid ja anneta"
194 | },
195 | "LITEMATICA-WARNING": null,
196 | "EDGE-WARNING": "Märkus: Microsoft Edge kasutamine ei ole toetatud.\\nPalun kasutage Chrome (soovitatud) või Tulirebane MapartCrafti jaoks",
197 | "NONE": "Puudub",
198 | "UNUSED": {
199 | "SECOND": "sekund",
200 | "SECONDS": "sekundit",
201 | "REMAINING": "jäänud",
202 | "SETTINGS-3D-OPTIMIZED": "Sees (optimiseeritud)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/src/locale/fr/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/locale/it/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/locale/it/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "Italian",
4 | "CREDITS": "Traduzione di psvigia"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": null
8 | },
9 | "FAQ": {
10 | "FAQ": "FAQ",
11 | "PLEASE-READ-1": "Per favore controlla la ",
12 | "PLEASE-READ-2": " prima di contattarmi!",
13 | "HAVE-YOU-READ": "Hai letto la FAQ?",
14 | "HELP-IN-ENGLISH": "Nota: Il supporto verrà fornito solo in inlgese",
15 | "VIDEO-TUTORIAL": "Video tutorial"
16 | },
17 | "DESCRIPTION": {
18 | "1": "Un generatore di file schematic e map.dat per la realizzazione di mapart in Minecraft, progettato per essere utilizzabile sia da admin sia da giocatori survival su server come ",
19 | "2": " ed eseguibile nel tuo browser",
20 | "3": "Ispirato dal ",
21 | "4": "generatore di mapart di Redstonehelper",
22 | "5": ", ha l'obbiettivo di implementare funzionalità molto richieste e di eliminare il bisogno di scaricare un programma",
23 | "6": "Puoi contattarmi su Discord ",
24 | "7": " oppure su Reddit ",
25 | "8": ". Le richieste di funzionalità e le segnalazioni di bug possono essere inviate su ",
26 | "9": null,
27 | "10": null
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "Selezione di blocchi",
31 | "PRESETS": {
32 | "TITLE": "Preset",
33 | "DELETE": "Elimina",
34 | "DELETE-ERROR-DEFAULT": null,
35 | "SAVE": "Salva",
36 | "SAVE-PROMPT-ENTER-NAME": "Inserisci un nome per il tuo preset:",
37 | "SHARE": "Condividi",
38 | "SHARE-TT": "Condivide i blocchi attualmente selezionati attraverso un link",
39 | "SHARE-WARNING-NONE-SELECTED": "Seleziona dei blocchi prima di condividerli!",
40 | "SHARE-LINK": "Condividi questo link per condividere i blocchi attualmente selezionati",
41 | "DOWNLOAD": "Scarica",
42 | "DOWNLOAD-TT": "Scarica la palette di colori da usare in Paint.net",
43 | "DOWNLOAD-WARNING-NONE-SELECTED": "Seleziona dei blocchi prima di scaricare la palette!",
44 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "Attenzione, la tua palette ha ",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-2": " colori, mentre il massimo in Paint.net è 96. Alcuni colori non saranno disponibili in Paint.net",
46 | "IMPORT-ERROR-CORRUPTED": "Il link del preset è corrotto!",
47 | "NONE": "Nulla",
48 | "EVERYTHING": "Tutto",
49 | "CARPETS": "Carpet",
50 | "GREYSCALE": null,
51 | "DELETE-CONFIRM": null
52 | },
53 | "UNSUPPORTED-PAST": null,
54 | "ADD-CUSTOM": {
55 | "TITLE": null,
56 | "BLOCK-NAME": null,
57 | "NEEDS-SUPPORT": null,
58 | "FLAMMABLE": null,
59 | "VERSIONS": null,
60 | "COLOUR-SET": null,
61 | "NBT-TAGS": null,
62 | "ADD": null,
63 | "ERROR-NONE-SELECTED": null,
64 | "ERROR-NO-NAME": null,
65 | "EXAMPLES": null,
66 | "DELETE": "Elimina",
67 | "NO-EXPORT": null
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "Anteprima",
72 | "BEST-RESOLUTION-TT": "Un'immagine sorgente con questa risoluzione funzionerà al meglio",
73 | "ASPECT-RATIO-MISMATCH-TT": "L'immagine non rispetta le proporzioni della mappa",
74 | "SCALE-MINUS-TT": "Ridurre l'anteprima",
75 | "SCALE-PLUS-TT": "Ingradire l'anteprima"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "Impostazioni",
79 | "MODE": "Modalità",
80 | "MODE-TT": "Seleziona la modalità in cui vorresti operare",
81 | "MODE-VISUAL": "Visiva",
82 | "MODE-VISUAL-NA": "Visiva (non disponibile)",
83 | "VERSION": "Versione",
84 | "VERSION-TT": "Seleziona la versione più vicina alla tua",
85 | "MAP-SIZE": "Dimensione della mappa",
86 | "CROP": {
87 | "TITLE": "Ritaglia",
88 | "TITLE-TT": "Ritaglia la tua immagine invece di deformarla",
89 | "OFF": null,
90 | "CENTER": null,
91 | "MANUAL": null,
92 | "ZOOM": null
93 | },
94 | "GRID-OVERLAY": null,
95 | "GRID-OVERLAY-TT": null,
96 | "3D": {
97 | "TITLE": "Staircasing",
98 | "TITLE-TT": "Aggiunge due ulteriori tonalità per ogni colore sfruttando le ombreggiature con cui le mappe rappresentano le differenze di quota",
99 | "OFF": "Off (2D)",
100 | "CLASSIC": "On (classico)",
101 | "VALLEY": null,
102 | "FULL-DARK": null,
103 | "FULL-LIGHT": null,
104 | "ON": "On",
105 | "ON-UNOBTAINABLE": "On (non ottenibili)",
106 | "FULL-UNOBTAINABLE": null
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "Aggiungi blocchi sotto",
111 | "NONE": "Nessun blocco",
112 | "IMPORTANT": "Blocchi importanti",
113 | "ALL": "Tutti i blocchi",
114 | "ALL-OPTIMIZED": "Tutti i blocchi (ottimizzato)",
115 | "ALL-DOUBLE": "Tutti doppi",
116 | "ALL-DOUBLE-OPTIMIZED": "Tutti doppi (ottimizzato)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "Blocchi da aggiungere",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "Relativo all'opzione precedente"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "Colori non ottenibili",
123 | "UNOBTAINABLE-COLOURS-TT": "Abilita i colori del formato map.dat non ottenibili con le schematiche",
124 | "TRANSPARENCY": null,
125 | "TRANSPARENCY-TT": null,
126 | "TRANSPARENCY-TOLERANCE": null,
127 | "MAPDAT-FILENAME-USE-ID": null,
128 | "MAPDAT-FILENAME-USE-ID-TT": null,
129 | "MAPDAT-FILENAME-ID-RANGE": null
130 | },
131 | "BETTER-COLOUR": "Colori migliori",
132 | "BETTER-COLOUR-TT": "Garantisce una maggiore precisione del colore",
133 | "DITHERING": {
134 | "TITLE": "Dithering",
135 | "TITLE-TT": "Aggiunge pixel con colori apparentemente casuali per rendere l'illusione di una gamma di colori più ampia",
136 | "NONE": "Nulla"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": null,
140 | "ENABLE": null,
141 | "BRIGHTNESS": null,
142 | "CONTRAST": null,
143 | "SATURATION": null,
144 | "BACKGROUND": {
145 | "TITLE": null,
146 | "TITLE-TT": null,
147 | "OFF": null,
148 | "DITHERED": null,
149 | "SMOOTH": null
150 | },
151 | "BACKGROUND-COLOUR": null
152 | },
153 | "EXTRAS": {
154 | "TITLE": null,
155 | "MORE-STAIRCASING-OPTIONS": null,
156 | "MORE-STAIRCASING-OPTIONS-TT": null
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "Seleziona dei blocchi prima di scaricare!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "SCARICA",
163 | "DOWNLOAD-TT": "Scarica l'nbt",
164 | "DOWNLOAD-SPLIT": "SCARICA DIVISO IN PORZIONI 1x1",
165 | "DOWNLOAD-SPLIT-TT": "Scarica l'nbt diviso in porzioni 1x1"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "SCARICA",
169 | "DOWNLOAD-TT": "Scarica il map.dat diviso in porzioni 1x1"
170 | },
171 | "ZIPPING": null
172 | },
173 | "MATERIALS": {
174 | "TITLE": "Materiali",
175 | "BLOCK": "Blocco",
176 | "AMOUNT": "Quantità",
177 | "PLACEHOLDER-BLOCK-TT": "Blocco esempio",
178 | "SHOW-PER-SPLIT": null,
179 | "SHOW-PER-SPLIT-TT": null,
180 | "REFRESH-MATERIALS": "AGGIORNA MATERIALI",
181 | "REFRESH-MATERIALS-TT": "Aggiorna la lista di materiali"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": null,
185 | "TITLE-TT": null,
186 | "TOO-BIG-FOR-SINGLE": null,
187 | "CONTROLS": null,
188 | "TO-EXIT": null,
189 | "SIZE": "Dimensione"
190 | },
191 | "DONATE": {
192 | "TITLE": "AIUTAMI A SALTARE LA CODA",
193 | "TITLE-TT": "Vedi i sostenitori e dona"
194 | },
195 | "LITEMATICA-WARNING": null,
196 | "EDGE-WARNING": "Nota: usare Microsoft Edge non è supportato.\\nPer favore usa Chrome (consigliato) o Firefox per MapartCraft",
197 | "NONE": "Nulla",
198 | "UNUSED": {
199 | "SECOND": "secondo",
200 | "SECONDS": "secondi",
201 | "REMAINING": "rimanente/i",
202 | "SETTINGS-3D-OPTIMIZED": "On (ottimizzato)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/src/locale/ja/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/locale/ja/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "Japanese",
4 | "CREDITS": "Translated by: co 91"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": "Minecraftの地図アート用 schematic / map.dat 生成ツール"
8 | },
9 | "FAQ": {
10 | "FAQ": "よくある質問",
11 | "PLEASE-READ-1": "ご質問の前に",
12 | "PLEASE-READ-2": "をお読みください!",
13 | "HAVE-YOU-READ": "「よくある質問」はお読みになりましたか?",
14 | "HELP-IN-ENGLISH": "注意:サポートは英語でのみ提供されます",
15 | "VIDEO-TUTORIAL": "動画チュートリアル"
16 | },
17 | "DESCRIPTION": {
18 | "1": "Minecraftの地図アート用 schematic および map.dat 生成ツール: ",
19 | "2": "のようなサーバーで管理者とサバイバルプレイヤーの双方が利用可能なように作られており,ブラウザ上で動作します.",
20 | "3": "このツールは",
21 | "4": "Redstonehelper氏の地図アートプログラム",
22 | "5": "に影響を受けており,要望の多い機能を追加し,プログラムをダウンロードせずに利用できることを目標としています.",
23 | "6": "Discord ",
24 | "7": " または Redit ",
25 | "8": " にてお気軽にお問い合わせください.機能の要望やバグ報告は GitHub で受け付けています: ",
26 | "9": "注意:MapartCraft は新しいバージョンに更新されました.不具合がある場合,以前のバージョンも利用できます: ",
27 | "10": "従来版"
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "ブロック選択",
31 | "PRESETS": {
32 | "TITLE": "プリセット",
33 | "DELETE": "削除",
34 | "DELETE-CONFIRM": "次のプリセットを削除しますか: ",
35 | "DELETE-ERROR-DEFAULT": "このプリセットはデフォルトであり,編集や削除はできません.",
36 | "SAVE": "保存",
37 | "SAVE-PROMPT-ENTER-NAME": "プリセット名を入力してください: ",
38 | "SHARE": "共有",
39 | "SHARE-TT": "現在選択されているブロックをリンクとして共有する",
40 | "SHARE-WARNING-NONE-SELECTED": "共有する前にブロックを選択してください!",
41 | "SHARE-LINK": "リンクをコピーして現在選択されているブロックを共有",
42 | "DOWNLOAD": "パレットをエクスポート",
43 | "DOWNLOAD-TT": "Paint.NET で利用できるカラーパレットをダウンロードする",
44 | "DOWNLOAD-WARNING-NONE-SELECTED": "パレットをダウンロードする前にブロックを選択してください!",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "注意:パレットには",
46 | "DOWNLOAD-WARNING-MAX-COLOURS-2": "色ありますが,Paint.NET では最大96色です.一部の色は Paint.NET では利用できません.",
47 | "IMPORT-ERROR-CORRUPTED": "プリセットのリンクが壊れています!",
48 | "NONE": "なし",
49 | "EVERYTHING": "すべて",
50 | "CARPETS": "カーペット",
51 | "GREYSCALE": "グレースケール"
52 | },
53 | "UNSUPPORTED-PAST": null,
54 | "ADD-CUSTOM": {
55 | "TITLE": "カスタムブロックを追加",
56 | "BLOCK-NAME": "ブロック名",
57 | "NEEDS-SUPPORT": "支えとなるブロックが必要",
58 | "FLAMMABLE": "可燃性",
59 | "VERSIONS": "バージョン",
60 | "COLOUR-SET": "カラーセット",
61 | "NBT-TAGS": "NBTタグ",
62 | "ADD": "追加",
63 | "ERROR-NONE-SELECTED": "追加する前にバージョンを選択してください",
64 | "ERROR-NO-NAME": "追加する前にブロック名を入力してください",
65 | "EXAMPLES": "例",
66 | "DELETE": "削除",
67 | "NO-EXPORT": "注意:カスタムブロックはエクスポートされません."
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "地図プレビュー",
72 | "BEST-RESOLUTION-TT": "この解像度の画像が最適です",
73 | "ASPECT-RATIO-MISMATCH-TT": "画像と地図の縦横比が一致しません",
74 | "SCALE-MINUS-TT": "プレビューを小さく",
75 | "SCALE-PLUS-TT": "プレビューを大きく"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "設定",
79 | "MODE": "形式",
80 | "MODE-TT": "利用するモードを選択してください",
81 | "MODE-VISUAL": "視覚化",
82 | "MODE-VISUAL-NA": "視覚化 (利用不可)",
83 | "VERSION": "バージョン",
84 | "VERSION-TT": "お使いのバージョンに最も近いものを選択してください",
85 | "MAP-SIZE": "地図サイズ",
86 | "CROP": {
87 | "TITLE": "切り抜き",
88 | "TITLE-TT": "画像を引き伸ばさずに切り抜きます",
89 | "OFF": "オフ",
90 | "CENTER": "中心",
91 | "MANUAL": "手動",
92 | "ZOOM": "ズーム"
93 | },
94 | "GRID-OVERLAY": "グリッド",
95 | "GRID-OVERLAY-TT": "チャンクと地図の境界をオーバーレイ表示します",
96 | "3D": {
97 | "TITLE": "階段化",
98 | "TITLE-TT": "地図を3Dにします.建造は難しくなりますが,色数が3倍になります!",
99 | "OFF": "オフ (2D)",
100 | "CLASSIC": "オン (Classic; 高さの変化が連続的)",
101 | "VALLEY": "オン (Valley; 高さの極小値を0に揃える)",
102 | "FULL-DARK": "すべて暗色",
103 | "FULL-LIGHT": "すべて明色",
104 | "ON": "オン",
105 | "ON-UNOBTAINABLE": "オン (標準では使用不可の色を使う)",
106 | "FULL-UNOBTAINABLE": "すべて使用不可の色"
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "下にブロックを付加",
111 | "NONE": "なし",
112 | "IMPORTANT": "必要なブロック",
113 | "ALL": "すべてのブロック",
114 | "ALL-OPTIMIZED": "すべてのブロック (最適化)",
115 | "ALL-DOUBLE": "すべて2層 ",
116 | "ALL-DOUBLE-OPTIMIZED": "すべて2層 (最適化)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "付加するブロック",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "前のオプションの関連設定"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "使用不可の色",
123 | "UNOBTAINABLE-COLOURS-TT": "schematicでは使用できない色を有効にします",
124 | "TRANSPARENCY": "透明度",
125 | "TRANSPARENCY-TT": "map.datの透明度を有効にします",
126 | "TRANSPARENCY-TOLERANCE": "許容値",
127 | "MAPDAT-FILENAME-USE-ID": "ファイル名の番号",
128 | "MAPDAT-FILENAME-USE-ID-TT": "地図データを 'map_#.dat' として保存します",
129 | "MAPDAT-FILENAME-ID-RANGE": "範囲"
130 | },
131 | "BETTER-COLOUR": "色の改善",
132 | "BETTER-COLOUR-TT": "色の精度を高めます",
133 | "DITHERING": {
134 | "TITLE": "ディザリング",
135 | "TITLE-TT": "見かけ上ランダムなピクセルを追加し,より多くの色を錯覚させます",
136 | "NONE": "なし"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": "画像の前処理",
140 | "ENABLE": "有効",
141 | "BRIGHTNESS": "明度",
142 | "CONTRAST": "コントラスト",
143 | "SATURATION": "彩度",
144 | "BACKGROUND": {
145 | "TITLE": "背景",
146 | "TITLE-TT": "透明度のある画像用",
147 | "OFF": "オフ",
148 | "DITHERED": "オン (ディザ)",
149 | "SMOOTH": "オン (平滑)"
150 | },
151 | "BACKGROUND-COLOUR": "色"
152 | },
153 | "EXTRAS": {
154 | "TITLE": "その他",
155 | "MORE-STAIRCASING-OPTIONS": "追加の階段化オプション",
156 | "MORE-STAIRCASING-OPTIONS-TT": "すべて暗色,すべて明色,すべて使用不可の色"
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "ダウンロードする前にブロックを選択してください!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "NBTをダウンロード",
163 | "DOWNLOAD-TT": "nbtファイルをダウンロードします",
164 | "DOWNLOAD-SPLIT": "1x1分割でダウンロード",
165 | "DOWNLOAD-SPLIT-TT": "地図単位に分割してnbtファイルをダウンロードします"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "MAPDATをダウンロード",
169 | "DOWNLOAD-TT": "地図単位に分割してmap.datファイルをダウンロードします"
170 | },
171 | "ZIPPING": "圧縮中"
172 | },
173 | "MATERIALS": {
174 | "TITLE": "材料",
175 | "BLOCK": "ブロック",
176 | "AMOUNT": "数",
177 | "PLACEHOLDER-BLOCK-TT": "プレースホルダ",
178 | "SHOW-PER-SPLIT": "各地図で最大の必要数のみ表示",
179 | "SHOW-PER-SPLIT-TT": "地図をロックして材料を使いまわす場合",
180 | "REFRESH-MATERIALS": "材料を更新",
181 | "REFRESH-MATERIALS-TT": "材料のリストを更新します"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": "オンラインで表示",
185 | "TITLE-TT": "schematicをダウンロードせずにオンラインで表示します",
186 | "TOO-BIG-FOR-SINGLE": "単一のschematicとしては大きすぎます; 1x1分割でダウンロードしてください",
187 | "CONTROLS": "操作",
188 | "TO-EXIT": "で終了",
189 | "SIZE": "サイズ"
190 | },
191 | "DONATE": {
192 | "TITLE": "プロジェクトの支援",
193 | "TITLE-TT": "支援者を見る/寄付する"
194 | },
195 | "LITEMATICA-WARNING": "警告:Litematica のサポートは1.15.2では十分ではありません; 1.16.5以上へのアップデートをお勧めします",
196 | "EDGE-WARNING": "注意:Microsoft Edge はサポートされていません.\\nGoogle Chrome (推奨) または Firefox をお使いください.",
197 | "NONE": "なし",
198 | "UNUSED": {
199 | "SECOND": "秒",
200 | "SECONDS": "秒",
201 | "REMAINING": "残り",
202 | "SETTINGS-3D-OPTIMIZED": "オン (最適化)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/src/locale/locale.js:
--------------------------------------------------------------------------------
1 | import Flag_de from "./de/flag.svg";
2 | import Strings_de from "./de/strings.json";
3 |
4 | import Flag_ua from "./ua/flag.svg";
5 | import Strings_ua from "./ua/strings.json";
6 |
7 | import Flag_en from "./en/flag.svg";
8 | import Strings_en from "./en/strings.json";
9 |
10 | import Flag_eo from "./eo/flag.svg";
11 | import Strings_eo from "./eo/strings.json";
12 |
13 | import Flag_es from "./es/flag.svg";
14 | import Strings_es from "./es/strings.json";
15 |
16 | import Flag_et from "./et/flag.svg";
17 | import Flag_et_pop from "./et/flag_pop.svg";
18 | import Strings_et from "./et/strings.json";
19 |
20 | import Flag_fr from "./fr/flag.svg";
21 | import Strings_fr from "./fr/strings.json";
22 |
23 | import Flag_it from "./it/flag.svg";
24 | import Strings_it from "./it/strings.json";
25 |
26 | import Flag_lt from "./lt/flag.svg";
27 | import Strings_lt from "./lt/strings.json";
28 |
29 | import Flag_pt from "./pt/flag.svg";
30 | import Strings_pt from "./pt/strings.json";
31 |
32 | import Flag_ru from "./ru/flag.svg";
33 | import Strings_ru from "./ru/strings.json";
34 |
35 | import Flag_zh_Hans from "./zh-Hans/flag.svg";
36 | import Strings_zh_Hans from "./zh-Hans/strings.json";
37 |
38 | import Flag_zh_Hant from "./zh-Hant/flag.svg";
39 | import Strings_zh_Hant from "./zh-Hant/strings.json";
40 |
41 | import Flag_pl from "./pl/flag.svg";
42 | import Strings_pl from "./pl/strings.json";
43 |
44 | import Flag_pt_Br from "./pt-Br/flag.svg";
45 | import Strings_pt_Br from "./pt-Br/strings.json";
46 |
47 | import Flag_ja from "./ja/flag.svg";
48 | import Strings_ja from "./ja/strings.json";
49 |
50 | const Locale = {
51 | en: { strings: Strings_en, flag: Flag_en },
52 | ua: { strings: Strings_ua, flag: Flag_ua },
53 | et: { strings: Strings_et, flag: Flag_et, flag_special: Flag_et_pop },
54 | lt: { strings: Strings_lt, flag: Flag_lt },
55 | ru: { strings: Strings_ru, flag: Flag_ru },
56 | de: { strings: Strings_de, flag: Flag_de },
57 | pl: { strings: Strings_pl, flag: Flag_pl },
58 | fr: { strings: Strings_fr, flag: Flag_fr },
59 | it: { strings: Strings_it, flag: Flag_it },
60 | pt: { strings: Strings_pt, flag: Flag_pt },
61 | es: { strings: Strings_es, flag: Flag_es },
62 | "zh-Hans": { strings: Strings_zh_Hans, flag: Flag_zh_Hans },
63 | "zh-Hant": { strings: Strings_zh_Hant, flag: Flag_zh_Hant },
64 | ja: { strings: Strings_ja, flag: Flag_ja },
65 | eo: { strings: Strings_eo, flag: Flag_eo },
66 | "pt-Br": { strings: Strings_pt_Br, flag: Flag_pt_Br },
67 | };
68 |
69 | export default Locale;
70 |
--------------------------------------------------------------------------------
/src/locale/lt/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/locale/lt/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "Latvian",
4 | "CREDITS": "Translecija nuo: NebulaViper"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": null
8 | },
9 | "FAQ": {
10 | "FAQ": "DKK",
11 | "PLEASE-READ-1": "Prašau peržiūrėti ",
12 | "PLEASE-READ-2": " prieš klausdami klausimus visur!",
13 | "HAVE-YOU-READ": "Ar tu perskaitei DKK?",
14 | "HELP-IN-ENGLISH": "Pastaba: pagalba bus teikiama tik anglų kalba",
15 | "VIDEO-TUTORIAL": "Vaizdo pamoka"
16 | },
17 | "DESCRIPTION": {
18 | "1": "Minecraft žemėlapių meno schematica ir map.dat generatorius, skirtas būti tikėtinas ir serverių adminams ir survivalo žaidėjams ant serverių kaip ",
19 | "2": ", naudojamas jūsų internetinėje naršyklėje",
20 | "3": "Inspiruotas nuo ",
21 | "4": "Redstonehelper'io žemėlapių meno programos",
22 | "5": ", Tikslu, kad pridėtų daug paprašytų bruožų ir pašalinti nora siūstis kitas programas",
23 | "6": "Galit laisvai su manim susisiekti ant Discord ",
24 | "7": " arba Reddit ",
25 | "8": ", bruožų norai ir pranešimai apie klaidas tęsiami ",
26 | "9": null,
27 | "10": null
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "Blokų pasirinktis",
31 | "PRESETS": {
32 | "TITLE": "Išankstiniai nustatymai",
33 | "DELETE": "Ištrinti",
34 | "DELETE-ERROR-DEFAULT": null,
35 | "SAVE": "Išsaugoti",
36 | "SAVE-PROMPT-ENTER-NAME": "Įveskite savo išankstinio nustatymo pavadinimą:",
37 | "SHARE": "Bendrinti",
38 | "SHARE-TT": "Bendrina blokus, kuriuos šiuo metu pasirinkote kaip nuoroda",
39 | "SHARE-WARNING-NONE-SELECTED": "Prieš pradedant dalintis, pasirinkite blokus!",
40 | "SHARE-LINK": "Jei norite bendrinti šiuo metu pasirinktus blokus, bendrinkite šia nuorodą",
41 | "DOWNLOAD": "Parsisiųsti",
42 | "DOWNLOAD-TT": "Atsisiunčiama spalvų paletė, naudojama Paint.net",
43 | "DOWNLOAD-WARNING-NONE-SELECTED": "Prieš atsiųsdami paletę, pasirinkite blokus!",
44 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "Įspėjimas: jūsų paletė turi ",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-2": "spalvų, o maksimali „Paint.net“ yra 96 . Kai kurios spalvos „Paint.net“ nebus prieinamos ",
46 | "IMPORT-ERROR-CORRUPTED": "Iš anksto nustatyta nuorodo sugadinta!",
47 | "NONE": "Niekas",
48 | "EVERYTHING": "Viskas",
49 | "CARPETS": "Kilimėliai",
50 | "GREYSCALE": null,
51 | "DELETE-CONFIRM": null
52 | },
53 | "UNSUPPORTED-PAST": null,
54 | "ADD-CUSTOM": {
55 | "TITLE": null,
56 | "BLOCK-NAME": null,
57 | "NEEDS-SUPPORT": null,
58 | "FLAMMABLE": null,
59 | "VERSIONS": null,
60 | "COLOUR-SET": null,
61 | "NBT-TAGS": null,
62 | "ADD": null,
63 | "ERROR-NONE-SELECTED": null,
64 | "ERROR-NO-NAME": null,
65 | "EXAMPLES": null,
66 | "DELETE": "Ištrinti",
67 | "NO-EXPORT": null
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "Žemėlapio peržiūra",
72 | "BEST-RESOLUTION-TT": "Šaltinio vaiždas su šia raiška veiks geriausiai",
73 | "ASPECT-RATIO-MISMATCH-TT": "Vaizdas neatitinka žemėlapio kraštinių santykio",
74 | "SCALE-MINUS-TT": "Padaryti peržiūra mažesne",
75 | "SCALE-PLUS-TT": "Padaryti peržiūra didesne"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "Nustatymai",
79 | "MODE": "Rėžimas",
80 | "MODE-TT": "Pasirinkti rėžima kuriame norite dirbti",
81 | "MODE-VISUAL": "Vaizdas",
82 | "MODE-VISUAL-NA": "Vaizdas (Nepasiekemas)",
83 | "VERSION": "Versija",
84 | "VERSION-TT": "Pasirinkite versiją, kuri yra arčiausiai jūsų naudojama",
85 | "MAP-SIZE": "Žemėlapio dydis",
86 | "CROP": {
87 | "TITLE": "Apkarpyti",
88 | "TITLE-TT": "Apkarpo vaizda vietoj išlankso",
89 | "OFF": null,
90 | "CENTER": null,
91 | "MANUAL": null,
92 | "ZOOM": null
93 | },
94 | "GRID-OVERLAY": null,
95 | "GRID-OVERLAY-TT": null,
96 | "3D": {
97 | "TITLE": "Laiptiniuoti",
98 | "TITLE-TT": "Padaro žemėlapį 3D. Sunkiau statyti, bet 3 kartus daugiau spalvų!",
99 | "OFF": "Išjungta (2D)",
100 | "CLASSIC": "Įjungta (clasikinė)",
101 | "VALLEY": null,
102 | "FULL-DARK": null,
103 | "FULL-LIGHT": null,
104 | "ON": "Įjungta",
105 | "ON-UNOBTAINABLE": "Įjungta (Nepasiekiamos)",
106 | "FULL-UNOBTAINABLE": null
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "Pridėti blokus po",
111 | "NONE": "Jokių blockų",
112 | "IMPORTANT": "Svarbi blokai",
113 | "ALL": "Visi blokai",
114 | "ALL-OPTIMIZED": "Visi blokai (optimazuota)",
115 | "ALL-DOUBLE": "Visi dvigubai",
116 | "ALL-DOUBLE-OPTIMIZED": "Visi dvigubai (optimazuota)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "Bloka pridėti",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "Susijęs su ankstesne pasirinktimi"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "Nepasiekiamos spalvos",
123 | "UNOBTAINABLE-COLOURS-TT": "Įjungia map.dat spalvas neprieinamas schemose",
124 | "TRANSPARENCY": null,
125 | "TRANSPARENCY-TT": null,
126 | "TRANSPARENCY-TOLERANCE": null,
127 | "MAPDAT-FILENAME-USE-ID": null,
128 | "MAPDAT-FILENAME-USE-ID-TT": null,
129 | "MAPDAT-FILENAME-ID-RANGE": null
130 | },
131 | "BETTER-COLOUR": "Geresnės spalvos",
132 | "BETTER-COLOUR-TT": "Suteikia geresnį spalvų tikslumą",
133 | "DITHERING": {
134 | "TITLE": "Ditheriuoti",
135 | "TITLE-TT": "Prideda iš pažiūros atsitiktinių taškų, kad iliustruotų daugiau spalvų",
136 | "NONE": "Nė vienas"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": null,
140 | "ENABLE": null,
141 | "BRIGHTNESS": null,
142 | "CONTRAST": null,
143 | "SATURATION": null,
144 | "BACKGROUND": {
145 | "TITLE": null,
146 | "TITLE-TT": null,
147 | "OFF": null,
148 | "DITHERED": null,
149 | "SMOOTH": null
150 | },
151 | "BACKGROUND-COLOUR": null
152 | },
153 | "EXTRAS": {
154 | "TITLE": null,
155 | "MORE-STAIRCASING-OPTIONS": null,
156 | "MORE-STAIRCASING-OPTIONS-TT": null
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "Prieš atsiųsdami pasirinkite blokus!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "PARSISIŲSTI",
163 | "DOWNLOAD-TT": "Parsisiųsti nbt",
164 | "DOWNLOAD-SPLIT": "ATSISIŲSTI 1x1 PER PUSE",
165 | "DOWNLOAD-SPLIT-TT": "Atsisiųskite nbt padalijimą į 1x1 dalis"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "PARSISIŲSTI",
169 | "DOWNLOAD-TT": "Atsisiųskite map.dat padaliję į 1x1 dalis"
170 | },
171 | "ZIPPING": null
172 | },
173 | "MATERIALS": {
174 | "TITLE": "Medžiagos",
175 | "BLOCK": "Blokai",
176 | "AMOUNT": "Kiekis",
177 | "PLACEHOLDER-BLOCK-TT": "Vietos rezervavimo blokas",
178 | "SHOW-PER-SPLIT": null,
179 | "SHOW-PER-SPLIT-TT": null,
180 | "REFRESH-MATERIALS": "ATNAUJINTI MEDŽIAGAS",
181 | "REFRESH-MATERIALS-TT": "Atnaujinti medžiagų sąrašą"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": null,
185 | "TITLE-TT": null,
186 | "TOO-BIG-FOR-SINGLE": null,
187 | "CONTROLS": null,
188 | "TO-EXIT": null,
189 | "SIZE": "Dydis"
190 | },
191 | "DONATE": {
192 | "TITLE": "PADĖKITE MAN PRALEISTI EILĘ",
193 | "TITLE-TT": "Peržiūrėkite rėmėjus ir aukokite"
194 | },
195 | "LITEMATICA-WARNING": null,
196 | "EDGE-WARNING": "Pastaba: nepalaikomas Microsoft Edge naudojimas. \\n Pagal „MapartCraft“ naudokite Chrome (pageidautina) arba Firefox.",
197 | "NONE": "Niekas",
198 | "UNUSED": {
199 | "SECOND": "sekundė",
200 | "SECONDS": "sekundės",
201 | "REMAINING": "likę",
202 | "SETTINGS-3D-OPTIMIZED": "Įjungta (optimizuota)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/src/locale/pl/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/locale/pl/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "Polish",
4 | "CREDITS": "Przetłumaczone przez: hipostajm"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": "Minecraftowy generator mapartów używający plików schematic i map.dat"
8 | },
9 | "FAQ": {
10 | "FAQ": "FAQ",
11 | "PLEASE-READ-1": "Proszę sprawdź ",
12 | "PLEASE-READ-2": " Przed zadaniem mi jakiego kolwiek pytania!",
13 | "HAVE-YOU-READ": "Przeczytałeś FAQ?",
14 | "HELP-IN-ENGLISH": "Uwaga: Pomoc będzie udzielana wyłącznie w języku angielskim",
15 | "VIDEO-TUTORIAL": "Wideo tutorial"
16 | },
17 | "DESCRIPTION": {
18 | "1": "Minecraftowy generator mapartów używający plików schematic i map.dat, zaprojektowany do bycia przyjaznym dla adminów serwerów i graczy surwiwalowych na serwerach jak ",
19 | "2": ", działający w twojej przeglądarce.",
20 | "3": "Inspirowany ",
21 | "4": "map art'owym programem Redstonehelper'a",
22 | "5": ", z celem do dodania bardzo chcianych rozwiązań oraz z usunięciem potrzeby pobierania programu.",
23 | "6": "Śmiało pisz do mnie na Discordzie ",
24 | "7": " lub na reddit'cie ",
25 | "8": ". chciane funkcje oraz zgłaszanie bug'ów idą na ",
26 | "9": "Uwaga: MapartCraft został zaktualizowany do nowych wersji. Jeżeli coś jest zepsute, możesz cięgle używać ",
27 | "10": "klasycznej wersji"
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "Wybieranie bloków",
31 | "PRESETS": {
32 | "TITLE": "Presety",
33 | "DELETE": "Usuń",
34 | "DELETE-ERROR-DEFAULT": "To jest podstawowym preset i nie może on być edytowany/usunięty.",
35 | "SAVE": "Zapisz",
36 | "SAVE-PROMPT-ENTER-NAME": "Wpisz nazwe dla twojego presetu:",
37 | "SHARE": "Udostępnij",
38 | "SHARE-TT": "Udostępniaj bloki które aktualnie wybrałeś w linku",
39 | "SHARE-WARNING-NONE-SELECTED": "Wybierz bloki zanim je udostępnisz!",
40 | "SHARE-LINK": "Skopiuj ten link aby udostępnić aktualnie wybrane bloki",
41 | "DOWNLOAD": "Eksportuj do PDN",
42 | "DOWNLOAD-TT": "Pobiera palete kolorów do użycia w Paint.NET",
43 | "DOWNLOAD-WARNING-NONE-SELECTED": "Wybierz bloki zanim pobierzesz palete!",
44 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "Ostrzeżenie, twoja paleta ma",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-2": " kolory, podczas gdy maksimum w Paint.NET to 96. Niektóre kolory będą niedostępne w Paint.NET",
46 | "IMPORT-ERROR-CORRUPTED": "Link z presetem jest uszkodzony!",
47 | "NONE": "Nic",
48 | "EVERYTHING": "Wszystko",
49 | "CARPETS": "Dywany",
50 | "GREYSCALE": "Szare bloki",
51 | "DELETE-CONFIRM": null
52 | },
53 | "UNSUPPORTED-PAST": null,
54 | "ADD-CUSTOM": {
55 | "TITLE": null,
56 | "BLOCK-NAME": null,
57 | "NEEDS-SUPPORT": null,
58 | "FLAMMABLE": null,
59 | "VERSIONS": null,
60 | "COLOUR-SET": null,
61 | "NBT-TAGS": null,
62 | "ADD": null,
63 | "ERROR-NONE-SELECTED": null,
64 | "ERROR-NO-NAME": null,
65 | "EXAMPLES": null,
66 | "DELETE": "Usuń",
67 | "NO-EXPORT": null
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "Podgląd mapy",
72 | "BEST-RESOLUTION-TT": "Źródłowy obraz z tą rozdzielczością będzie działał lepiej",
73 | "ASPECT-RATIO-MISMATCH-TT": "Obraz nie pasuje do rozmiaru mapy",
74 | "SCALE-MINUS-TT": "Zrób podgląd mniejszy",
75 | "SCALE-PLUS-TT": "Zrób podgląd większy"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "Ustawienia",
79 | "MODE": "Tryb",
80 | "MODE-TT": "Wibierz tryb który wolisz",
81 | "MODE-VISUAL": null,
82 | "MODE-VISUAL-NA": "Visual (nie dostępne)",
83 | "VERSION": "Wersja",
84 | "VERSION-TT": "Wybierz wersje najbliższą do tej na której grasz",
85 | "MAP-SIZE": "Rozmiar mapy",
86 | "CROP": {
87 | "TITLE": "Przytnij",
88 | "TITLE-TT": "Przytnij swój obraz zamiast rozciągania go",
89 | "OFF": "Wył.",
90 | "CENTER": "Wycentrowany",
91 | "MANUAL": "Ręcznie",
92 | "ZOOM": null
93 | },
94 | "GRID-OVERLAY": "Siatka",
95 | "GRID-OVERLAY-TT": "Nakłada siatkę przedstawiającą fragmenty 16x16 i podziały 1x1",
96 | "3D": {
97 | "TITLE": "Rodzaj podbudowy",
98 | "TITLE-TT": "Robi mape 3D. Cięższe do zbudowania, ale 3 razy więcej kolorów!",
99 | "OFF": "Wył. (2D)",
100 | "CLASSIC": "Wł. (Classic)",
101 | "VALLEY": "Wł. (Valley)",
102 | "FULL-DARK": "Full-Ciemne",
103 | "FULL-LIGHT": "Full-Jasne",
104 | "ON": "Wł.",
105 | "ON-UNOBTAINABLE": "Wł. (Niedostępne)",
106 | "FULL-UNOBTAINABLE": "Całkowicie niedostępne"
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "Dodać bloki pod",
111 | "NONE": "Bez bloków",
112 | "IMPORTANT": "Ważne bloki",
113 | "ALL": "Wszystkie bloki",
114 | "ALL-OPTIMIZED": "Wszystkie bloki (zoptymalizowany)",
115 | "ALL-DOUBLE": "Wszystkie podwójnie",
116 | "ALL-DOUBLE-OPTIMIZED": "Wszystkie podwójnie (zoptymalizowany)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "Blok pod",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "Powiązane z poprzednią opcją"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "niedostępne kolory",
123 | "UNOBTAINABLE-COLOURS-TT": "Umożliwia kolory w map.dat których są nie dostępne w schematics",
124 | "TRANSPARENCY": "Przezroczystość",
125 | "TRANSPARENCY-TT": "Umożliwia przeztoczystość dla map.dat",
126 | "TRANSPARENCY-TOLERANCE": "Tolerancja",
127 | "MAPDAT-FILENAME-USE-ID": "Numeryczne nazwy plików",
128 | "MAPDAT-FILENAME-USE-ID-TT": "Pobiera pliki map.dat jako 'map_#.dat'",
129 | "MAPDAT-FILENAME-ID-RANGE": "Przedział"
130 | },
131 | "BETTER-COLOUR": "Lepsze kolory",
132 | "BETTER-COLOUR-TT": "Zapewnia lepszą dokładność kolorów",
133 | "DITHERING": {
134 | "TITLE": "Tryb towrzenia",
135 | "TITLE-TT": "Dodaje pozornie losowe pixele dające iluzje większej ilości kolorów",
136 | "NONE": "Nic"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": "Wstępne przetwarzanie obrazu",
140 | "ENABLE": "Włączone",
141 | "BRIGHTNESS": "Jasność",
142 | "CONTRAST": "Kontrast",
143 | "SATURATION": "Saturacja",
144 | "BACKGROUND": {
145 | "TITLE": "tło",
146 | "TITLE-TT": "Dla obrazów z przezroczystością",
147 | "OFF": "Wył.",
148 | "DITHERED": "Wł. (dithered)",
149 | "SMOOTH": "Wł. (gładkie)"
150 | },
151 | "BACKGROUND-COLOUR": "kolory"
152 | },
153 | "EXTRAS": {
154 | "TITLE": "Dodadki",
155 | "MORE-STAIRCASING-OPTIONS": "Więcej rodzajów podbudowy",
156 | "MORE-STAIRCASING-OPTIONS-TT": "Full-Ciemne, Full-Jasne, oraz Całkowicie niedostępne opcje"
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "Wybierz bloki przed pobraniem!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "POBIERZ NBT",
163 | "DOWNLOAD-TT": "Pobierz nbt",
164 | "DOWNLOAD-SPLIT": "POBIERZ JAKO PODZIAŁ 1x1",
165 | "DOWNLOAD-SPLIT-TT": "Pobierz nbt podzielone na chunki 1x1"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "POBIERZ MAPDAT",
169 | "DOWNLOAD-TT": "Pobierz map.dat podzielone na chunki 1x1"
170 | },
171 | "ZIPPING": null
172 | },
173 | "MATERIALS": {
174 | "TITLE": "Materiały",
175 | "BLOCK": "Bloki",
176 | "AMOUNT": "Ilość",
177 | "PLACEHOLDER-BLOCK-TT": "Placeholderowe bloki",
178 | "SHOW-PER-SPLIT": null,
179 | "SHOW-PER-SPLIT-TT": null,
180 | "REFRESH-MATERIALS": "odśwież materiały",
181 | "REFRESH-MATERIALS-TT": "odśwież liczbe materiałów"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": "POKAŻ ONLINE",
185 | "TITLE-TT": "Pokaż schemat online bez pobierania",
186 | "TOO-BIG-FOR-SINGLE": "Za duże na pojedyńczy schemat; pobierz 1x1 podział ",
187 | "CONTROLS": "Sterowanie",
188 | "TO-EXIT": "By wyjść",
189 | "SIZE": "Rozmiar"
190 | },
191 | "DONATE": {
192 | "TITLE": "POMÓŻ MI SKIPNĄĆ KOLEJKE",
193 | "TITLE-TT": "Pokaż wspierających oraz donejtorów"
194 | },
195 | "LITEMATICA-WARNING": "Warning, Litematica does not support 1.15.2 very well; recommended action is to update to 1.16.5",
196 | "EDGE-WARNING": "Note: using Microsoft Edge is unsupported.\\nPlease use Chrome (preferred) or Firefox for MapartCraft",
197 | "NONE": "None",
198 | "UNUSED": {
199 | "SECOND": "Drugi",
200 | "SECONDS": "Drugie",
201 | "REMAINING": "pozostałe",
202 | "SETTINGS-3D-OPTIMIZED": "Wł. (zoptymalizowane)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/src/locale/pt-Br/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/locale/pt/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/locale/pt/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "Portuguese",
4 | "CREDITS": "Traduzido por: Brochacho6"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": null
8 | },
9 | "FAQ": {
10 | "FAQ": "FAQ",
11 | "PLEASE-READ-1": "Por Favor verifique o ",
12 | "PLEASE-READ-2": " antes de fazer perguntas em qualquer lado",
13 | "HAVE-YOU-READ": "Ja leste o FAQ",
14 | "HELP-IN-ENGLISH": "Note: Ajuda será apenas feita em inglês",
15 | "VIDEO-TUTORIAL": "Video tutorial"
16 | },
17 | "DESCRIPTION": {
18 | "1": "Um gerador de schematics de mapart e ficheiros map.dat para minecraft, feito para ser factível para ambos admins de servidores ou jogadores de modo sobrevivência em servidores como ",
19 | "2": ", executado no seu Navegador",
20 | "3": "Inspirado pelo ",
21 | "4": "programa de map art de Redstonehelper",
22 | "5": ", com o objetivo de adicionar recursos muito pedidos e remover a necessidade de descarregar o programa",
23 | "6": "Sinta-se livre para me enviar uma mensagem no Discord ",
24 | "7": " ou Reddit ",
25 | "8": ", solicitações de recursos e relatórios de bugs vão no ",
26 | "9": null,
27 | "10": null
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "Seleção de blocos",
31 | "PRESETS": {
32 | "TITLE": "Predefenições",
33 | "DELETE": "Apagar",
34 | "DELETE-ERROR-DEFAULT": null,
35 | "SAVE": "Salvar",
36 | "SAVE-PROMPT-ENTER-NAME": "Digite um nome para sua predefinição:",
37 | "SHARE": "Partilhar",
38 | "SHARE-TT": "Partilha os blocos que você tem atualmente selecionados como um link",
39 | "SHARE-WARNING-NONE-SELECTED": "Selecione blocos anted de partilhá-los",
40 | "SHARE-LINK": "Partilhe este link para partilhar os blocos atualmente selecionados",
41 | "DOWNLOAD": "Descarregar",
42 | "DOWNLOAD-TT": "Descarregar a palete para uso no Paint.net",
43 | "DOWNLOAD-WARNING-NONE-SELECTED": "Selecione blocos antes de descarregar palete",
44 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "Aviso, a sua palete tem ",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-2": " cores, enquanto o máximo no Paint.net é 96. Algumas cores não estão disponiveis no Paint.net",
46 | "IMPORT-ERROR-CORRUPTED": "Link da predefinição está corrupto!",
47 | "NONE": "Nada",
48 | "EVERYTHING": "Tudo",
49 | "CARPETS": "Carpete",
50 | "GREYSCALE": null,
51 | "DELETE-CONFIRM": null
52 | },
53 | "UNSUPPORTED-PAST": null,
54 | "ADD-CUSTOM": {
55 | "TITLE": null,
56 | "BLOCK-NAME": null,
57 | "NEEDS-SUPPORT": null,
58 | "FLAMMABLE": null,
59 | "VERSIONS": null,
60 | "COLOUR-SET": null,
61 | "NBT-TAGS": null,
62 | "ADD": null,
63 | "ERROR-NONE-SELECTED": null,
64 | "ERROR-NO-NAME": null,
65 | "EXAMPLES": null,
66 | "DELETE": "Apagar",
67 | "NO-EXPORT": null
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "Pré-Visualização do mapa",
72 | "BEST-RESOLUTION-TT": "Uma imagem fonte com esta resolução funcionará melhor",
73 | "ASPECT-RATIO-MISMATCH-TT": "A imagem não corresponde à proporção do mapa",
74 | "SCALE-MINUS-TT": "Tornar a pré-visualização menor",
75 | "SCALE-PLUS-TT": "Tornar a pré-visualização maior"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "Defenições",
79 | "MODE": "Modo",
80 | "MODE-TT": "Selecione o modo em que deseja operar",
81 | "MODE-VISUAL": "Visual",
82 | "MODE-VISUAL-NA": "Visual (não disponível)",
83 | "VERSION": "Versão",
84 | "VERSION-TT": "Selecione a versão mais próxima do que está a utilizar",
85 | "MAP-SIZE": "Tamanho do mapa",
86 | "CROP": {
87 | "TITLE": "Cortar",
88 | "TITLE-TT": "Cortar a sua imagem em vez de esticá-la",
89 | "OFF": null,
90 | "CENTER": null,
91 | "MANUAL": null,
92 | "ZOOM": null
93 | },
94 | "GRID-OVERLAY": null,
95 | "GRID-OVERLAY-TT": null,
96 | "3D": {
97 | "TITLE": "Escadeado",
98 | "TITLE-TT": "Tornar o mapa 3D. Mais difícil de construit mais terá 3 vezes mais cor!",
99 | "OFF": "Desligado (2D)",
100 | "CLASSIC": "Ligado (classico)",
101 | "VALLEY": null,
102 | "FULL-DARK": null,
103 | "FULL-LIGHT": null,
104 | "ON": "Ligado",
105 | "ON-UNOBTAINABLE": "Ligado (inatingíveis)",
106 | "FULL-UNOBTAINABLE": null
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "Adicionar blocos debaixo",
111 | "NONE": "Sem blocos",
112 | "IMPORTANT": "Blocos debaixo",
113 | "ALL": "Todos os blocos",
114 | "ALL-OPTIMIZED": "Todos os blocos (otimizado)",
115 | "ALL-DOUBLE": "Tudo em Dobro",
116 | "ALL-DOUBLE-OPTIMIZED": "Tudo em Dobro (otimizado)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "Bloco a adicionar",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "Relacionado à opção anterior"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "Cores inatingíveis",
123 | "UNOBTAINABLE-COLOURS-TT": "Possibilita que ficheiros map.dat tenham cores inatingível em schematics",
124 | "TRANSPARENCY": null,
125 | "TRANSPARENCY-TT": null,
126 | "TRANSPARENCY-TOLERANCE": null,
127 | "MAPDAT-FILENAME-USE-ID": null,
128 | "MAPDAT-FILENAME-USE-ID-TT": null,
129 | "MAPDAT-FILENAME-ID-RANGE": null
130 | },
131 | "BETTER-COLOUR": "Cor melhor",
132 | "BETTER-COLOUR-TT": "Dá-lhe uma melhor precisão de cor",
133 | "DITHERING": {
134 | "TITLE": "Dithering",
135 | "TITLE-TT": "Adiciona pixeis aleatórios para dar uma preceção de mais cor",
136 | "NONE": "Nenhuma"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": null,
140 | "ENABLE": null,
141 | "BRIGHTNESS": null,
142 | "CONTRAST": null,
143 | "SATURATION": null,
144 | "BACKGROUND": {
145 | "TITLE": null,
146 | "TITLE-TT": null,
147 | "OFF": null,
148 | "DITHERED": null,
149 | "SMOOTH": null
150 | },
151 | "BACKGROUND-COLOUR": null
152 | },
153 | "EXTRAS": {
154 | "TITLE": null,
155 | "MORE-STAIRCASING-OPTIONS": null,
156 | "MORE-STAIRCASING-OPTIONS-TT": null
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "Selecione blocos antes de descarregar!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "DESCARREGAR",
163 | "DOWNLOAD-TT": "Descarregar o ficheiro nbt",
164 | "DOWNLOAD-SPLIT": "Descarregar como 1x1 dividido",
165 | "DOWNLOAD-SPLIT-TT": "Descarregar o nbt dividido em chunks 1x1"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "DESCARREGAR",
169 | "DOWNLOAD-TT": "Descarregar o map.dat dividido em chunks 1x1"
170 | },
171 | "ZIPPING": null
172 | },
173 | "MATERIALS": {
174 | "TITLE": "Materias",
175 | "BLOCK": "Bloco",
176 | "AMOUNT": "Quantidade",
177 | "PLACEHOLDER-BLOCK-TT": "Bloco de Supporte",
178 | "SHOW-PER-SPLIT": null,
179 | "SHOW-PER-SPLIT-TT": null,
180 | "REFRESH-MATERIALS": "REFRESCAR MATERIAIS",
181 | "REFRESH-MATERIALS-TT": "Refrescar a lista de materiais"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": null,
185 | "TITLE-TT": null,
186 | "TOO-BIG-FOR-SINGLE": null,
187 | "CONTROLS": null,
188 | "TO-EXIT": null,
189 | "SIZE": "Tamanho"
190 | },
191 | "DONATE": {
192 | "TITLE": "AJUDA-ME A PASSAR A FILA À FRENTE",
193 | "TITLE-TT": "Ver apoiadores ou doar"
194 | },
195 | "LITEMATICA-WARNING": null,
196 | "EDGE-WARNING": "Note: Microsoft Edge não é suportado\\nPor Favor utilize Chrome (preferido) ou Firefox para MapartCraft",
197 | "NONE": "Nada",
198 | "UNUSED": {
199 | "SECOND": "segundo",
200 | "SECONDS": "segundos",
201 | "REMAINING": "faltando",
202 | "SETTINGS-3D-OPTIMIZED": "Ligado (optimizado)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/src/locale/ru/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/locale/ua/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/locale/zh-Hans/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
15 |
17 |
18 |
20 | image/svg+xml
21 |
23 |
24 |
25 |
26 |
28 |
48 |
50 |
57 |
63 |
69 |
75 |
81 |
88 |
89 |
91 |
102 |
103 | 简
114 |
115 |
--------------------------------------------------------------------------------
/src/locale/zh-Hans/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "Chinese (Simplified)",
4 | "CREDITS": "翻译自: OSC311"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": "我的世界地图画 schematic 档和 map.dat 档生成器"
8 | },
9 | "FAQ": {
10 | "FAQ": "常见问题",
11 | "PLEASE-READ-1": "在询问任何问题前,请先阅读",
12 | "PLEASE-READ-2": "!",
13 | "HAVE-YOU-READ": "你读过'常见问题'了吗?",
14 | "HELP-IN-ENGLISH": "注意:常见问题将仅以英语提供",
15 | "VIDEO-TUTORIAL": "影片教学"
16 | },
17 | "DESCRIPTION": {
18 | "1": "一个我的世界地图画 schematic 档和 map.dat 档生成器, 服务器管理员和例如在",
19 | "2": "服务器上的生存玩家都可使用, 并允许您在浏览器中运行",
20 | "3": "启发自",
21 | "4": "Redstonehelper 地图画生成程序",
22 | "5": ", 其目标是添加需求量大的功能并消除下载程序的需要",
23 | "6": "可以随时在 Discord ",
24 | "7": " 或 Reddit 上向我发送消息 ",
25 | "8": ", 功能请求和错误报告可发布于",
26 | "9": "注意:MapartCraft 已更新为新版本。 如果有任何损坏,您仍然可以使用 ",
27 | "10": "旧版本"
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "方块选择",
31 | "PRESETS": {
32 | "TITLE": "预设调色",
33 | "DELETE": "删除",
34 | "DELETE-ERROR-DEFAULT": "这是默认预设调色,无法被编辑/删除",
35 | "SAVE": "保存",
36 | "SAVE-PROMPT-ENTER-NAME": "输入预设调色的名称:",
37 | "SHARE": "分享",
38 | "SHARE-TT": "以连结分享您当前选择的方块",
39 | "SHARE-WARNING-NONE-SELECTED": "分享之前要选择方块!",
40 | "SHARE-LINK": "分享此链接以分享您当前选择的方块",
41 | "DOWNLOAD": "下载",
42 | "DOWNLOAD-TT": "下载调色板以在 Paint.net 中使用",
43 | "DOWNLOAD-WARNING-NONE-SELECTED": "在下载调色板之前要选择方块!",
44 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "警告,您的调色板有 ",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-2": " 颜色,而 Paint.net 中的最大值为96. 某些颜色在 Paint.net 中将不可用",
46 | "IMPORT-ERROR-CORRUPTED": "预设链接已损坏!",
47 | "NONE": "没有",
48 | "EVERYTHING": "全部东西",
49 | "CARPETS": "地毯",
50 | "GREYSCALE": "灰阶",
51 | "DELETE-CONFIRM": null
52 | },
53 | "UNSUPPORTED-PAST": "不受支援的过去",
54 | "ADD-CUSTOM": {
55 | "TITLE": "新增自订方块",
56 | "BLOCK-NAME": "方块名称",
57 | "NEEDS-SUPPORT": "需要承托",
58 | "FLAMMABLE": "可燃",
59 | "VERSIONS": "版本",
60 | "COLOUR-SET": "颜色集",
61 | "NBT-TAGS": "NBT 标签",
62 | "ADD": "新增",
63 | "ERROR-NONE-SELECTED": "新增前要先选择版本",
64 | "ERROR-NO-NAME": "新增前要先输入方块名称",
65 | "EXAMPLES": "范例",
66 | "DELETE": "删除",
67 | "NO-EXPORT": "提醒:自订方块不会被汇出"
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "地图预览",
72 | "BEST-RESOLUTION-TT": "具有此分辨率的源图像效果最佳",
73 | "ASPECT-RATIO-MISMATCH-TT": "图片与地图的长宽比例不符",
74 | "SCALE-MINUS-TT": "缩小预览",
75 | "SCALE-PLUS-TT": "放大预览"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "设定",
79 | "MODE": "模式",
80 | "MODE-TT": "选择您要使用的模式",
81 | "MODE-VISUAL": "视觉效果",
82 | "MODE-VISUAL-NA": "视觉效果(不可用)",
83 | "VERSION": "版本",
84 | "VERSION-TT": "选择最接近您正在使用的版本",
85 | "MAP-SIZE": "地图尺寸",
86 | "CROP": {
87 | "TITLE": "裁剪",
88 | "TITLE-TT": "裁剪图像而不是将其拉伸",
89 | "OFF": "关闭",
90 | "CENTER": "中心",
91 | "MANUAL": "手动",
92 | "ZOOM": "缩放"
93 | },
94 | "GRID-OVERLAY": "网格",
95 | "GRID-OVERLAY-TT": "显示 16x16 的区块和 1x1 分割的网格",
96 | "3D": {
97 | "TITLE": "梯式",
98 | "TITLE-TT": "将地图制作为3D。 很难制造,但是表现出3倍的颜色范围!",
99 | "OFF": "关(2D)",
100 | "CLASSIC": "开(原版)",
101 | "VALLEY": "开(山谷版)",
102 | "FULL-DARK": "全暗",
103 | "FULL-LIGHT": "全亮",
104 | "ON": "开",
105 | "ON-UNOBTAINABLE": "开 (无法取得)",
106 | "FULL-UNOBTAINABLE": "全无法取得"
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "在下面添加方块",
111 | "NONE": "没有方块",
112 | "IMPORTANT": "重要方块",
113 | "ALL": "全部方块",
114 | "ALL-OPTIMIZED": "全部方块 (优化)",
115 | "ALL-DOUBLE": "全部双层",
116 | "ALL-DOUBLE-OPTIMIZED": "全部双层 (优化)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "要添加的方块",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "与上一个选项相关"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "无法获得的颜色",
123 | "UNOBTAINABLE-COLOURS-TT": "启用schematic中无法获得的 map.dat 档颜色",
124 | "TRANSPARENCY": "透明度",
125 | "TRANSPARENCY-TT": "为 map.dat 启用透明度",
126 | "TRANSPARENCY-TOLERANCE": "宽容度",
127 | "MAPDAT-FILENAME-USE-ID": "数字文件名",
128 | "MAPDAT-FILENAME-USE-ID-TT": "将地图数据另存为'map_#.dat'",
129 | "MAPDAT-FILENAME-ID-RANGE": "范围"
130 | },
131 | "BETTER-COLOUR": "更好的色准",
132 | "BETTER-COLOUR-TT": "为您提供更好的色彩准确性",
133 | "DITHERING": {
134 | "TITLE": "抖动像素化",
135 | "TITLE-TT": "添加看似随机的像素以产生更多颜色的错觉",
136 | "NONE": "没有"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": "图像预处理",
140 | "ENABLE": "开",
141 | "BRIGHTNESS": "亮度",
142 | "CONTRAST": "对比度",
143 | "SATURATION": "饱和度",
144 | "BACKGROUND": {
145 | "TITLE": "背景",
146 | "TITLE-TT": "专用于有透明背景的图像",
147 | "OFF": "关",
148 | "DITHERED": "开(抖动化)",
149 | "FLAT": "开(一致化)"
150 | },
151 | "BACKGROUND-COLOUR": "颜色"
152 | },
153 | "EXTRAS": {
154 | "TITLE": "额外",
155 | "MORE-STAIRCASING-OPTIONS": "更多梯式选项",
156 | "MORE-STAIRCASING-OPTIONS-TT": "全暗、全亮及全无法取得选项"
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "下载之前要先选择方块!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "下载 NBT",
163 | "DOWNLOAD-TT": "下载 nbt 档",
164 | "DOWNLOAD-SPLIT": "以1x1分割下载",
165 | "DOWNLOAD-SPLIT-TT": "将 nbt 分成1x1区块来下载"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "下载 MAPDAT",
169 | "DOWNLOAD-TT": "将 map.dat 分成1x1区块来下载"
170 | },
171 | "ZIPPING": "压缩中"
172 | },
173 | "MATERIALS": {
174 | "TITLE": "材料",
175 | "BLOCK": "方块",
176 | "AMOUNT": "合计",
177 | "PLACEHOLDER-BLOCK-TT": "占位方块",
178 | "SHOW-PER-SPLIT": "只显示每个分割区块需要的最大材料",
179 | "SHOW-PER-SPLIT-TT": "用于锁定地图的材料重用",
180 | "REFRESH-MATERIALS": "刷新材料",
181 | "REFRESH-MATERIALS-TT": "刷新材料清单"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": "线上检视",
185 | "TITLE-TT": "无需下载即可在线检视 schematic 档",
186 | "TOO-BIG-FOR-SINGLE": "单个 schematic 档太大; 需要分割 1x1 来下载",
187 | "CONTROLS": "操控",
188 | "TO-EXIT": "前往退出",
189 | "SIZE": "地图尺寸"
190 | },
191 | "DONATE": {
192 | "TITLE": "帮助我跳过队列",
193 | "TITLE-TT": "查看支持者并捐赠"
194 | },
195 | "LITEMATICA-WARNING": "警告,Litematica 对 1.15.2 的支援不是很好; 建议更新到 1.16.5",
196 | "EDGE-WARNING": "注意:不支持使用 Microsoft Edge。\\ n请使用 Chrome(首选)或 Firefox 来登上 MapartCraft",
197 | "NONE": "没有",
198 | "UNUSED": {
199 | "SECOND": "秒",
200 | "SECONDS": "秒",
201 | "REMAINING": "剩余",
202 | "SETTINGS-3D-OPTIMIZED": "开(优化版)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/src/locale/zh-Hant/flag.svg:
--------------------------------------------------------------------------------
1 |
2 |
15 |
17 |
18 |
20 | image/svg+xml
21 |
23 |
24 |
25 |
26 |
27 |
29 |
49 |
51 |
58 |
64 |
70 |
76 |
82 |
89 |
90 |
92 |
103 |
104 | 繁
115 |
116 |
--------------------------------------------------------------------------------
/src/locale/zh-Hant/strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "TRANSLATION": {
3 | "NAME": "Chinese (Traditional)",
4 | "CREDITS": "翻譯自: OSC311, SiderealArt"
5 | },
6 | "HEAD-META-TAGS": {
7 | "DESCRIPTION": "一個 Minecraft 地圖畫 schematic 及 map.dat 產生器"
8 | },
9 | "FAQ": {
10 | "FAQ": "常見問題",
11 | "PLEASE-READ-1": "在詢問任何問題前,請先閱讀",
12 | "PLEASE-READ-2": "!",
13 | "HAVE-YOU-READ": "您讀過常見問題了嗎?",
14 | "HELP-IN-ENGLISH": "提醒:將以英文提供協助",
15 | "VIDEO-TUTORIAL": "影片教學"
16 | },
17 | "DESCRIPTION": {
18 | "1": "一個 Minecraft 地圖畫 schematic 及 map.dat 產生器,伺服器管理員和例如在 ",
19 | "2": "的生存玩家皆可使用,並直接在您的瀏覽器運行。",
20 | "3": "啟發自 ",
21 | "4": "Redstonehelper 製作的地圖畫產生器",
22 | "5": ",目標為新增其他功能,且不再需要下載程式。",
23 | "6": "歡迎在 Discord ",
24 | "7": " 或 Reddit 私訊我 ",
25 | "8": "。如要回報 Bug 或是建議功能,請至 ",
26 | "9": "提醒:MapartCraft 已更新到新版本。如果在使用上有任何問題,您仍可使用 ",
27 | "10": "舊版"
28 | },
29 | "BLOCK-SELECTION": {
30 | "TITLE": "選擇方塊",
31 | "PRESETS": {
32 | "TITLE": "調色盤",
33 | "DELETE": "刪除",
34 | "DELETE-ERROR-DEFAULT": "此為預設調色盤,故無法編輯或刪除",
35 | "SAVE": "儲存",
36 | "SAVE-PROMPT-ENTER-NAME": "請為您的調色盤取名字:",
37 | "SHARE": "分享",
38 | "SHARE-TT": "將您目前選擇的方塊以連結分享",
39 | "SHARE-WARNING-NONE-SELECTED": "請先選擇方塊再分享!",
40 | "SHARE-LINK": "複製此連結以分享您目前選擇的方塊",
41 | "DOWNLOAD": "下載",
42 | "DOWNLOAD-TT": "下載可於 Paint.NET 使用的調色盤",
43 | "DOWNLOAD-WARNING-NONE-SELECTED": "請先選擇方塊再下載調色盤!",
44 | "DOWNLOAD-WARNING-MAX-COLOURS-1": "警告:您的調色盤有 ",
45 | "DOWNLOAD-WARNING-MAX-COLOURS-2": " 種顏色,但 Paint.NET 最多只支援 96 種顏色,某些顏色在 Paint.NET 將無法使用。",
46 | "IMPORT-ERROR-CORRUPTED": "連結損毀!",
47 | "NONE": "無",
48 | "EVERYTHING": "所有方塊",
49 | "CARPETS": "地毯",
50 | "GREYSCALE": "灰階",
51 | "DELETE-CONFIRM": null
52 | },
53 | "UNSUPPORTED-PAST": "不支援的過往",
54 | "ADD-CUSTOM": {
55 | "TITLE": "新增自訂方塊",
56 | "BLOCK-NAME": "方塊名稱",
57 | "NEEDS-SUPPORT": "需要支撐",
58 | "FLAMMABLE": "可燃",
59 | "VERSIONS": "版本",
60 | "COLOUR-SET": "顏色集",
61 | "NBT-TAGS": "NBT 標籤",
62 | "ADD": "新增",
63 | "ERROR-NONE-SELECTED": "請選擇版本再新增方塊。",
64 | "ERROR-NO-NAME": "請輸入方塊名稱再新增。",
65 | "EXAMPLES": "範例",
66 | "DELETE": "刪除",
67 | "NO-EXPORT": "提醒:自訂方塊不會被匯出。"
68 | }
69 | },
70 | "MAP-PREVIEW": {
71 | "TITLE": "地圖預覽",
72 | "BEST-RESOLUTION-TT": "建議使用此解析度的圖片",
73 | "ASPECT-RATIO-MISMATCH-TT": "圖片與地圖的長寬比不相符",
74 | "SCALE-MINUS-TT": "縮小預覽",
75 | "SCALE-PLUS-TT": "放大預覽"
76 | },
77 | "MAP-SETTINGS": {
78 | "TITLE": "設定",
79 | "MODE": "模式",
80 | "MODE-TT": "選擇您要使用的模式",
81 | "MODE-VISUAL": "視覺化",
82 | "MODE-VISUAL-NA": "視覺化 (無法使用)",
83 | "VERSION": "版本",
84 | "VERSION-TT": "請選擇最接近您目前使用的版本",
85 | "MAP-SIZE": "地圖大小",
86 | "CROP": {
87 | "TITLE": "裁切",
88 | "TITLE-TT": "裁切您的圖片,而非將其拉伸",
89 | "OFF": "關閉",
90 | "CENTER": "中心",
91 | "MANUAL": "手動",
92 | "ZOOM": "縮放"
93 | },
94 | "GRID-OVERLAY": "網格",
95 | "GRID-OVERLAY-TT": "在預覽圖中顯示 16*16 的區塊及 1x1 的方格網格。",
96 | "3D": {
97 | "TITLE": "階層化",
98 | "TITLE-TT": "讓地圖畫變成 3D。更難建造,但色彩範圍能夠擴增三倍!",
99 | "OFF": "關閉 (2D)",
100 | "CLASSIC": "啟用 (傳統)",
101 | "VALLEY": "啟用 (山谷)",
102 | "FULL-DARK": "全暗",
103 | "FULL-LIGHT": "全亮",
104 | "ON": "啟用",
105 | "ON-UNOBTAINABLE": "啟用 (無法取得)",
106 | "FULL-UNOBTAINABLE": "全無法取得"
107 | },
108 | "NBT-SPECIFIC": {
109 | "WHERE-SUPPORT-BLOCKS": {
110 | "TITLE": "在下方添加方塊",
111 | "NONE": "無",
112 | "IMPORTANT": "重要方塊",
113 | "ALL": "所有方塊",
114 | "ALL-OPTIMIZED": "所有方塊 (最佳化)",
115 | "ALL-DOUBLE": "所有雙層",
116 | "ALL-DOUBLE-OPTIMIZED": "所有雙層 (最佳化)"
117 | },
118 | "SUPPORT-BLOCK-TO-ADD": "要添加的方塊",
119 | "SUPPORT-BLOCK-TO-ADD-TT": "與先前選項關聯"
120 | },
121 | "MAPDAT-SPECIFIC": {
122 | "UNOBTAINABLE-COLOURS": "無法取得的顏色",
123 | "UNOBTAINABLE-COLOURS-TT": "啟用無法在 schematics 中取得的顏色",
124 | "TRANSPARENCY": "透明度",
125 | "TRANSPARENCY-TT": "為 map.dat 啟用透明度",
126 | "TRANSPARENCY-TOLERANCE": "容忍度",
127 | "MAPDAT-FILENAME-USE-ID": "檔名編號",
128 | "MAPDAT-FILENAME-USE-ID-TT": "map.dat 的檔名格式將設為 'map_#.dat'",
129 | "MAPDAT-FILENAME-ID-RANGE": "範圍"
130 | },
131 | "BETTER-COLOUR": "提高色準",
132 | "BETTER-COLOUR-TT": "提升色彩準確度",
133 | "DITHERING": {
134 | "TITLE": "抖動",
135 | "TITLE-TT": "添加看似隨機的像素,以產生更多顏色的錯覺",
136 | "NONE": "無"
137 | },
138 | "PREPROCESSING": {
139 | "TITLE": "預處理",
140 | "ENABLE": "啟用",
141 | "BRIGHTNESS": "亮度",
142 | "CONTRAST": "對比度",
143 | "SATURATION": "飽和度",
144 | "BACKGROUND": {
145 | "TITLE": "背景",
146 | "TITLE-TT": "透明背景的圖片專用",
147 | "OFF": "停用",
148 | "DITHERED": "啟用 (抖動)",
149 | "SMOOTH": "啟用 (光滑的)"
150 | },
151 | "BACKGROUND-COLOUR": "顏色"
152 | },
153 | "EXTRAS": {
154 | "TITLE": "額外",
155 | "MORE-STAIRCASING-OPTIONS": "更多階層化選項",
156 | "MORE-STAIRCASING-OPTIONS-TT": "全暗、全亮及全無法取得"
157 | }
158 | },
159 | "DOWNLOAD": {
160 | "ERROR-NONE-SELECTED": "請先選擇方塊再下載!",
161 | "NBT-SPECIFIC": {
162 | "DOWNLOAD": "下載 NBT",
163 | "DOWNLOAD-TT": "下載 NBT",
164 | "DOWNLOAD-SPLIT": "分割為 1x1",
165 | "DOWNLOAD-SPLIT-TT": "將 NBT 分割成 1x1 的區塊後下載"
166 | },
167 | "MAPDAT-SPECIFIC": {
168 | "DOWNLOAD": "下載 MAPDAT",
169 | "DOWNLOAD-TT": "將 map.dat 分割成 1x1 的區塊後下載"
170 | },
171 | "ZIPPING": "壓縮中"
172 | },
173 | "MATERIALS": {
174 | "TITLE": "材料",
175 | "BLOCK": "方塊",
176 | "AMOUNT": "數量",
177 | "PLACEHOLDER-BLOCK-TT": "預留方塊",
178 | "SHOW-PER-SPLIT": "只顯示每個分割區塊所需的最大材料",
179 | "SHOW-PER-SPLIT-TT": "用於鎖定地圖後材料重複使用",
180 | "REFRESH-MATERIALS": "重新載入材料",
181 | "REFRESH-MATERIALS-TT": "重新載入材料列表"
182 | },
183 | "VIEW-ONLINE": {
184 | "TITLE": "線上檢視",
185 | "TITLE-TT": "在下載前即可在線上預覽",
186 | "TOO-BIG-FOR-SINGLE": "單一 schematic 過大;請下載 1x1 分割",
187 | "CONTROLS": "操控",
188 | "TO-EXIT": "以退出",
189 | "SIZE": "大小"
190 | },
191 | "DONATE": {
192 | "TITLE": "幫我跳過佇列",
193 | "TITLE-TT": "查看贊助者並捐贈"
194 | },
195 | "LITEMATICA-WARNING": "警告:Litematica 不完全支援 1.15.2;建議升級至 1.16.5",
196 | "EDGE-WARNING": "提醒:不支援 Microsoft Edge。\\n建議使用 Google Chrome 或是 Firefox.",
197 | "NONE": "無",
198 | "UNUSED": {
199 | "SECOND": "秒",
200 | "SECONDS": "秒",
201 | "REMAINING": "剩餘",
202 | "SETTINGS-3D-OPTIMIZED": "啟用 (最佳化)"
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/tools/JSONIO.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """Nice easy JSON loading / saving functions."""
4 |
5 | import os
6 | import json
7 |
8 | class JSONIO():
9 | @staticmethod
10 | def rectifiedPath(path):
11 | """Norm path to remove double // and ./../dir etc, and expand ~"""
12 | return os.path.expanduser(
13 | os.path.normpath(path)
14 | )
15 |
16 | @classmethod
17 | def loadFromFilename(cls, filename):
18 | filename = cls.rectifiedPath(filename)
19 | with open(filename) as f:
20 | return json.load(f)
21 |
22 | @classmethod
23 | def saveToFilename(cls, filename, JSONObject, indent = 2):
24 | filename = cls.rectifiedPath(filename)
25 | with open(filename, "w") as f:
26 | f.write(
27 | json.dumps(JSONObject, indent = indent, ensure_ascii = False)
28 | )
29 | f.write("\n")
30 |
--------------------------------------------------------------------------------
/tools/Palette128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/tools/Palette128.png
--------------------------------------------------------------------------------
/tools/Palette128_Unobtainable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/tools/Palette128_Unobtainable.png
--------------------------------------------------------------------------------
/tools/Palette128_Unobtainable_Trans.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rebane2001/mapartcraft/0f24df5d7a913f978bdd4738de95bc11461d497e/tools/Palette128_Unobtainable_Trans.png
--------------------------------------------------------------------------------
/tools/SAOLogging.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """Nice logging, with colours on Linux. 'setupRootLogger' makes argparse integration trivial."""
4 |
5 | import argparse
6 | import logging
7 | from sys import platform
8 |
9 | class CustomFormatter(logging.Formatter):
10 | """Logging Formatter to add colors and count warning / errors"""
11 |
12 | fg_brightBlue = "\x1b[94m"
13 | fg_yellow = "\x1b[33m"
14 | fg_red = "\x1b[31m"
15 | fg_brightRedBold = "\x1b[91;1m"
16 | reset = "\x1b[0m"
17 |
18 | def __init__(self, messagefmt, datefmt):
19 | super().__init__()
20 | self.messagefmt = messagefmt
21 | self.datefmt = datefmt
22 |
23 | self.formats = {
24 | logging.DEBUG: "{}{}{}".format(self.fg_brightBlue, self.messagefmt, self.reset),
25 | logging.INFO: "{}".format(self.messagefmt),
26 | logging.WARNING: "{}{}{}".format(self.fg_yellow, self.messagefmt, self.reset),
27 | logging.ERROR: "{}{}{}".format(self.fg_red, self.messagefmt, self.reset),
28 | logging.CRITICAL: "{}{}{}".format(self.fg_brightRedBold, self.messagefmt, self.reset)
29 | }
30 |
31 | self.formaters = {
32 | logging.DEBUG: logging.Formatter(self.formats[logging.DEBUG], datefmt = self.datefmt),
33 | logging.INFO: logging.Formatter(self.formats[logging.INFO], datefmt = self.datefmt),
34 | logging.WARNING: logging.Formatter(self.formats[logging.WARNING], datefmt = self.datefmt),
35 | logging.ERROR: logging.Formatter(self.formats[logging.ERROR], datefmt = self.datefmt),
36 | logging.CRITICAL: logging.Formatter(self.formats[logging.CRITICAL], datefmt = self.datefmt)
37 | }
38 |
39 | def format(self, record):
40 | formatter = self.formaters[record.levelno]
41 | return formatter.format(record)
42 |
43 | def setupRootLogger(verbosityLevel,
44 | quietnessLevel,
45 | messagefmt = "[%(asctime)s][%(levelname)s] %(message)s (%(filename)s:%(lineno)d)",
46 | datefmt = "%Y-%m-%d %H:%M:%S",
47 | enableColour = True
48 | ):
49 | loggingLevel = 10 * (2 + quietnessLevel - verbosityLevel)
50 | rootLogger = logging.getLogger()
51 | rootLogger.setLevel(loggingLevel)
52 |
53 | consoleHandler = logging.StreamHandler()
54 | if enableColour and platform == "linux":
55 | consoleHandler.setFormatter(CustomFormatter(messagefmt = messagefmt, datefmt = datefmt))
56 | else:
57 | consoleHandler.setFormatter(logging.Formatter(fmt = messagefmt, datefmt = datefmt))
58 | rootLogger.addHandler(consoleHandler)
59 |
60 | def criticalLogExit(message):
61 | logging.critical(message)
62 | logging.critical("Exiting")
63 | raise SystemExit
64 |
65 | def logTree(title, tree, finals = None, logLeaves = True, loggingLevel = logging.INFO):
66 | """Log a dictionary as a tree"""
67 | if finals is None:
68 | finals = []
69 | if not isinstance(tree, dict):
70 | logging.log(msg = "{}{}{}".format(
71 | "".join([" " if final else "│" for final in finals[:-1]] +
72 | ["└" if final else "├" for final in finals[-1:]]),
73 | title, ": {}".format(tree) if logLeaves else ""), level = loggingLevel)
74 | else:
75 | logging.log(msg = "{}{}".format(
76 | "".join([" " if final else "│" for final in finals[:-1]] +
77 | ["└" if final else "├" for final in finals[-1:]]),
78 | title), level = loggingLevel)
79 | tree_items = list(tree.items())
80 | for key, value in tree_items[:-1]:
81 | logTree(key, value, finals = finals + [False], logLeaves = logLeaves, loggingLevel = loggingLevel)
82 | for key, value in tree_items[-1:]:
83 | logTree(key, value, finals = finals + [True], logLeaves = logLeaves, loggingLevel = loggingLevel)
84 |
85 | def getParser(docstring, *args, **kwargs):
86 | """Basic argument parser with verbosity arguments already added. Supply __doc__ as docstring for the description argument of the parser."""
87 | # we use this function instead of inheriting ArgumentParser lest subparsers also have verbosity options...
88 | parser = argparse.ArgumentParser(description = docstring, *args, **kwargs)
89 | parser_group_verbosity = parser.add_argument_group("logging").add_mutually_exclusive_group(required = False)
90 | parser_group_verbosity.add_argument("-v", "--verbose",
91 | help = "Increase logging verbosity: -v for debug",
92 | action = "count",
93 | default = 0)
94 | parser_group_verbosity.add_argument("-q", "--quiet",
95 | help = "Decrease logging verbosity: -q for warning, -qq for error, -qqq for critical, -qqqq for no logging messages",
96 | action = "count",
97 | default = 0)
98 |
99 | return parser
100 |
101 | if __name__ == "__main__":
102 | parser = getParser(__doc__)
103 |
104 | args = parser.parse_args()
105 |
106 | setupRootLogger(args.verbose, args.quiet)
107 |
108 | logging.debug("Debug message")
109 | logging.info("Info message")
110 | logging.warning("Warning message")
111 | logging.error("Error message")
112 | logging.critical("Critical message")
113 |
--------------------------------------------------------------------------------
/tools/addColoursJSONColourSet.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """For adding an empty colourSet to coloursJSON"""
4 |
5 | import os
6 | import logging
7 |
8 | from SAOLogging import getParser, setupRootLogger
9 | from JSONIO import JSONIO
10 |
11 | filePath_coloursJSON = os.path.normpath("../src/components/mapart/json/coloursJSON.json")
12 |
13 | def addColourSet(coloursJSON, mapdatId, tonesRGB):
14 | logging.debug("Adding colourSet")
15 | newColourSet_key = len(coloursJSON.keys())
16 | logging.info("New colourSetId: {}".format(str(newColourSet_key)))
17 | if newColourSet_key >= 64:
18 | logging.warning("colourSetId {} >= 64; this is unsupported and may break both mapdats and coloursJSON / textures.png".format(str(newColourSet_key)))
19 | newColourSet_value = {
20 | "tonesRGB": {
21 | "dark": [],
22 | "normal": [],
23 | "light": [],
24 | "unobtainable": [],
25 | },
26 | "blocks": {},
27 | "mapdatId": mapdatId
28 | }
29 | for toneIndex, toneKey in enumerate(newColourSet_value["tonesRGB"].keys()):
30 | newColourSet_value["tonesRGB"][toneKey] = tonesRGB[3 * toneIndex: 3 * (toneIndex + 1)]
31 | logging.debug("colourSet to add: {}".format(newColourSet_value))
32 | coloursJSON[str(newColourSet_key)] = newColourSet_value
33 | logging.debug("Added colourSet")
34 | return coloursJSON
35 |
36 | if __name__ == "__main__":
37 | parser = getParser(__doc__)
38 |
39 | # parser.add_argument("colourSetId",
40 | # help = "colourSetId of the colour set to add. Recommended to NOT do this manually but instead call this script multiple times in the order desired",
41 | # metavar = ("COLOURSETID",),
42 | # action = "store",
43 | # type = int)
44 | parser.add_argument("mapdatId",
45 | help = "Mojang-specified mapdatId (see https://minecraft.wiki/w/Map_item_format#Color_table)",
46 | metavar = "MAPDATID",
47 | action = "store",
48 | type = int)
49 | parser.add_argument("tonesRGB",
50 | help = "Tones specified in RGB form in the order dark normal light unobtainable",
51 | metavar = "TONESRGB",
52 | nargs = 12,
53 | action = "store",
54 | type = int)
55 |
56 | args = parser.parse_args()
57 |
58 | setupRootLogger(args.verbose, args.quiet)
59 |
60 | logging.debug("args: {}".format(args))
61 |
62 | logging.debug("Loading coloursJSON from {}".format(filePath_coloursJSON))
63 | coloursJSON = JSONIO.loadFromFilename(filePath_coloursJSON)
64 | logging.debug("Loaded coloursJSON")
65 |
66 | coloursJSON = addColourSet(coloursJSON, args.mapdatId, args.tonesRGB)
67 |
68 | logging.debug("Saving coloursJSON to {}".format(filePath_coloursJSON))
69 | JSONIO.saveToFilename(filePath_coloursJSON, coloursJSON, indent = 4)
70 | logging.debug("Saved coloursJSON")
71 |
--------------------------------------------------------------------------------
/tools/addLocaleLanguage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """Tool for adding a new language to the locale folder. Make sure to manually add a flag and edit src/locale/locale.js"""
4 |
5 | import os
6 |
7 | from SAOLogging import getParser, setupRootLogger
8 | from JSONIO import JSONIO
9 |
10 | def nullifyTree(tree):
11 | if isinstance(tree, dict):
12 | for key, value in tree.items():
13 | tree[key] = nullifyTree(value)
14 | return tree
15 | else:
16 | return None
17 |
18 | def addLocaleLanguage(languageCode):
19 | locale = JSONIO.loadFromFilename("../src/locale/en/strings.json")
20 | os.makedirs(JSONIO.rectifiedPath("../src/locale/{}".format(languageCode)), exist_ok = True)
21 | locale = nullifyTree(locale)
22 | JSONIO.saveToFilename("../src/locale/{}/strings.json".format(languageCode), locale)
23 |
24 | if __name__ == "__main__":
25 | parser = getParser(__doc__)
26 |
27 | parser.add_argument("LANG",
28 | help = "Language code of the locale to create, eg 'en' or 'de'.")
29 |
30 | args = parser.parse_args()
31 |
32 | setupRootLogger(args.verbose, args.quiet)
33 |
34 | addLocaleLanguage(args.LANG)
35 |
--------------------------------------------------------------------------------
/tools/addLocaleString.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """Tool for adding a string to all locale files"""
4 |
5 | import os
6 |
7 | from SAOLogging import getParser, setupRootLogger, criticalLogExit
8 | from JSONIO import JSONIO
9 |
10 | def touchLocaleString(languageCode, force, path, enOrNull = None):
11 | filename = "../src/locale/{}/strings.json".format(languageCode)
12 | localeJSON = JSONIO.loadFromFilename(filename)
13 | pathSections = path.split("/")
14 |
15 | localeFolder = localeJSON
16 | for pathSectionIndex, pathSection in enumerate(pathSections[:-1]):
17 | if not pathSection in localeFolder:
18 | localeFolder[pathSection] = {}
19 | localeFolder = localeFolder[pathSection]
20 | elif isinstance(localeFolder[pathSection], dict):
21 | localeFolder = localeFolder[pathSection]
22 | elif force:
23 | localeFolder[pathSection] = {}
24 | localeFolder = localeFolder[pathSection]
25 | elif localeFolder[pathSection] is None:
26 | criticalLogExit("{}: Refusing to override None entry {} with subfolder".format(languageCode, "/".join(pathSections[:pathSectionIndex + 1])))
27 | elif isinstance(localeFolder[pathSection], str):
28 | criticalLogExit("{}: Refusing to override string {} with subfolder".format(languageCode, "/".join(pathSections[:pathSectionIndex + 1])))
29 |
30 | finalPathSection = pathSections[-1]
31 | if force or not finalPathSection in localeFolder:
32 | localeFolder[finalPathSection] = enOrNull
33 | elif isinstance(localeFolder[finalPathSection], dict):
34 | criticalLogExit("{}: Refusing to override folder {} with '{}'".format(languageCode, path, enOrNull))
35 | elif localeFolder[finalPathSection] is None:
36 | criticalLogExit("{}: Refusing to override None entry {} with '{}'".format(languageCode, path, enOrNull))
37 | elif isinstance(localeFolder[finalPathSection], str):
38 | criticalLogExit("{}: Refusing to override string {} with '{}'".format(languageCode, path, enOrNull))
39 |
40 | JSONIO.saveToFilename(filename, localeJSON)
41 |
42 | if __name__ == "__main__":
43 | parser = getParser(__doc__)
44 |
45 | parser.add_argument("-f", "--force",
46 | help = "Overwrite pre-existing string or subsection",
47 | action = "store_true",
48 | default = False)
49 | parser.add_argument("PATH",
50 | help = "String path within locale JSON, eg 'BLOCK-SELECTION/TITLE'; '/' separates subsections")
51 | parser.add_argument("--en",
52 | help = "Optionally set the English version of the string now",
53 | default = None)
54 |
55 | args = parser.parse_args()
56 |
57 | setupRootLogger(args.verbose, args.quiet)
58 |
59 | languageCodes = [d for d in
60 | os.listdir(JSONIO.rectifiedPath("../src/locale")) if
61 | os.path.isdir(os.path.join(JSONIO.rectifiedPath("../src/locale"), d))
62 | ]
63 | for languageCode in languageCodes:
64 | touchLocaleString(languageCode, args.force, args.PATH.upper(), args.en if languageCode == "en" else None)
65 |
--------------------------------------------------------------------------------
/tools/addMinecraftVersion.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """For adding a version to coloursJSON.json and supportedVersions.json.
4 | This assumes that all blocks valid for the current last version are also valid for the version to be added; do check first!"""
5 |
6 | from SAOLogging import getParser, setupRootLogger
7 | from JSONIO import JSONIO
8 |
9 | def addVersion_coloursJSON(MCVersion):
10 | coloursJSON = JSONIO.loadFromFilename("../src/components/mapart/json/coloursJSON.json")
11 | supportedVersions = JSONIO.loadFromFilename("../src/components/mapart/json/supportedVersions.json")
12 | lastVersion = list(supportedVersions.values())[-1]["MCVersion"]
13 | for colourSet in coloursJSON.values():
14 | for block in colourSet["blocks"].values():
15 | if lastVersion in block["validVersions"]:
16 | if isinstance(block["validVersions"][lastVersion], str):
17 | block["validVersions"][MCVersion] = block["validVersions"][lastVersion]
18 | else:
19 | block["validVersions"][MCVersion] = "&{}".format(lastVersion)
20 | JSONIO.saveToFilename("../src/components/mapart/json/coloursJSON.json", coloursJSON, indent = 4)
21 |
22 |
23 | def addVersion_supportedVersions(MCVersion, DataVersion):
24 | supportedVersions = JSONIO.loadFromFilename("../src/components/mapart/json/supportedVersions.json")
25 | supportedVersions[MCVersion.replace(".", "_")] = {"MCVersion": MCVersion, "NBTVersion": DataVersion}
26 | JSONIO.saveToFilename("../src/components/mapart/json/supportedVersions.json", supportedVersions)
27 |
28 |
29 | if __name__ == "__main__":
30 | parser = getParser(__doc__)
31 |
32 | parser.add_argument("MCVersion",
33 | help = "Minecraft version to add, eg '1.14.4'")
34 | parser.add_argument("DataVersion",
35 | help = "Minecraft data version to add, eg '1976' for 1.14.4",
36 | type = int)
37 |
38 | args = parser.parse_args()
39 |
40 | setupRootLogger(args.verbose, args.quiet)
41 |
42 | addVersion_coloursJSON(args.MCVersion)
43 | addVersion_supportedVersions(args.MCVersion, args.DataVersion)
44 |
--------------------------------------------------------------------------------
/tools/createTestPaletteNBT.js:
--------------------------------------------------------------------------------
1 | // Add these to `nbt.jsworker` to create a schematic containing all valid blocks for a MC version.
2 | // This is mainly to test if blocks have changed between MC versions.
3 | // Watch out for redstone blocks and TNT being placed next to each other!
4 |
5 | // set options:
6 | // size 1x1
7 | // staircasing CLASSIC
8 | // addblocksunder ALLDOUBLE
9 |
10 |
11 |
12 | class Map_NBT_SpecialTest extends Map_NBT {
13 | constructor(map) {
14 | super(map);
15 | this.NBT_json.value.author.value = "TESTING_PALETTE";
16 | this.colourSetCycles = {}; // set in constructPaletteLookups
17 | }
18 |
19 | constructPaletteLookups() {
20 | for (const [colourSetId, colourSet] of Object.entries(coloursJSON)) {
21 | this.colourSetCycles[colourSetId] = { index: 0, modulo: 0 };
22 | for (const [blockId, block] of Object.entries(colourSet.blocks)) {
23 | if (optionValue_version.MCVersion in block.validVersions) {
24 | this.palette_colourSetId_paletteId[`${colourSetId}_${blockId}`] = this.palette_paletteId_colourSetId.length;
25 | this.palette_paletteId_colourSetId.push(`${colourSetId}_${blockId}`);
26 | this.colourSetCycles[colourSetId].modulo++;
27 | }
28 | }
29 | }
30 | this.palette_colourSetId_paletteId["NOOBLINE_SCAFFOLD"] = this.palette_paletteId_colourSetId.length;
31 | this.palette_paletteId_colourSetId.push("NOOBLINE_SCAFFOLD");
32 | }
33 |
34 | setNBT_json_palette() {
35 | this.palette_paletteId_colourSetId.forEach((colourSetIdBlockIdCombo) => {
36 | let paletteItemToPush = {};
37 | if (colourSetIdBlockIdCombo === "NOOBLINE_SCAFFOLD") {
38 | paletteItemToPush.Name = {
39 | type: TagTypes.string,
40 | value: `minecraft:${optionValue_supportBlock.toLowerCase()}`,
41 | };
42 | } else {
43 | const [, colourSetId, blockId] = colourSetIdBlockIdCombo.match(/(.*)_(.*)/);
44 | let blockNBTData = coloursJSON[colourSetId].blocks[blockId].validVersions[optionValue_version.MCVersion];
45 | if (typeof blockNBTData === "string") {
46 | // this is of the form eg "&1.12.2"
47 | blockNBTData = coloursJSON[colourSetId].blocks[blockId].validVersions[blockNBTData.slice(1)];
48 | }
49 | paletteItemToPush.Name = {
50 | type: TagTypes.string,
51 | value: `minecraft:${blockNBTData.NBTName}`,
52 | };
53 | if (Object.keys(blockNBTData.NBTArgs).length !== 0) {
54 | paletteItemToPush.Properties = { type: TagTypes.compound, value: {} };
55 | Object.keys(blockNBTData.NBTArgs).forEach((NBTArg_key) => {
56 | paletteItemToPush.Properties.value[NBTArg_key] = {
57 | type: TagTypes.string,
58 | value: blockNBTData.NBTArgs[NBTArg_key],
59 | };
60 | });
61 | }
62 | }
63 | this.NBT_json.value.palette.value.value.push(paletteItemToPush);
64 | });
65 | }
66 |
67 | setMapColoursLayout() {
68 | const colourSetIdRows = [
69 | [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], // concrete
70 | [35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50], // terracotta
71 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 29, 30, 31],
72 | [32, 33, 34, 51, 52, 53, 54, 55, 56, 57],
73 | ];
74 | this.mapColoursLayout = [];
75 | for (let i = 0; i < 128; i++) {
76 | this.mapColoursLayout.push([]);
77 | }
78 | for (let rowNumber = 0; rowNumber < colourSetIdRows.length; rowNumber++) {
79 | const colourSetIdRow = colourSetIdRows[rowNumber];
80 | for (let columnNumber = 0; columnNumber < colourSetIdRow.length; columnNumber++) {
81 | const colourSetId = colourSetIdRow[columnNumber].toString();
82 | for (const tone of ["dark", "normal", "light"]) {
83 | // create an 8x8 square
84 | for (let i = 0; i < 8; i++) {
85 | for (let j = 0; j < 8; j++) {
86 | this.mapColoursLayout[8 * columnNumber + i].push({
87 | colourSetId: colourSetId,
88 | tone: tone,
89 | });
90 | }
91 | }
92 | }
93 | }
94 | }
95 | for (let i = 0; i < 128; i++) {
96 | for (let j = this.mapColoursLayout[i].length; j < 128; j++) {
97 | this.mapColoursLayout[i].push({
98 | colourSetId: "NOOBLINE_SCAFFOLD",
99 | tone: "normal",
100 | });
101 | }
102 | }
103 | }
104 |
105 | returnPhysicalBlock(x, y, z, colourSetId) {
106 | if (colourSetId === "NOOBLINE_SCAFFOLD") {
107 | return super.returnPhysicalBlock(x, y, z, colourSetId);
108 | } else {
109 | const blockToReturn = {
110 | pos: { type: TagTypes.list, value: { type: TagTypes.int, value: [x, y, z] } },
111 | state: { type: TagTypes.int, value: this.palette_colourSetId_paletteId[`${colourSetId}_0`] + this.colourSetCycles[colourSetId].index }, // assumes 0 always exists; on 1.12 gives undefined; grass shows
112 | };
113 | this.colourSetCycles[colourSetId].index++;
114 | this.colourSetCycles[colourSetId].index %= this.colourSetCycles[colourSetId].modulo;
115 | return blockToReturn;
116 | }
117 | }
118 |
119 | getNBT() {
120 | this.setMapColoursLayout();
121 |
122 | return super.getNBT();
123 | }
124 | }
125 |
126 |
127 |
128 | // Add to onmessage
129 |
130 | progressReportHead = "PROGRESS_REPORT_NBT_JOINED";
131 | let X = new Map_NBT_SpecialTest({ materials: {}, supportBlockCount: 0, coloursLayout: null });
132 | postMessage({
133 | head: "NBT_ARRAY",
134 | body: {
135 | whichMap_x: 0,
136 | whichMap_y: 0,
137 | NBT_Array: X.getNBT(),
138 | },
139 | });
140 | return;
141 |
142 |
143 |
--------------------------------------------------------------------------------