├── .github
└── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
├── .gitignore
├── .gitmodules
├── CHANGELOG.md
├── LICENSE
├── MISSING_FEATURES.md
├── README.md
├── REPLACEMENTS.md
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
├── main
├── kotlin
│ └── br
│ │ └── com
│ │ └── gamemods
│ │ └── j2nwc
│ │ ├── WorldConverter.kt
│ │ ├── WorldConverterCLI.kt
│ │ └── internal
│ │ ├── JavaChunk.kt
│ │ ├── LevelFileConverter.kt
│ │ ├── NukkitChunk.kt
│ │ ├── RegionFileConverter.kt
│ │ ├── block-converter.kt
│ │ ├── chunk-converter.kt
│ │ ├── entity-converter.kt
│ │ ├── integrity-check.kt
│ │ ├── item-converter.kt
│ │ ├── properties.kt
│ │ └── text-converter.kt
└── resources
│ ├── bedrock-2-nukkit.properties
│ ├── bedrock-2-powernukkit.properties
│ ├── biomes.properties
│ ├── block-states.properties
│ ├── enchantments.properties
│ ├── entity-ids.properties
│ ├── items.properties
│ ├── java-entities.properties
│ ├── java-inherited-waterlogging.txt
│ ├── nukkit-block-ids.properties
│ ├── nukkit-item-ids.properties
│ ├── paintings.properties
│ ├── potions.properties
│ ├── powernukkit-block-ids.properties
│ ├── powernukkit-item-ids.properties
│ ├── status-effect-ids.properties
│ ├── status-effect-java-ids.properties
│ ├── tags.properties
│ └── tipped-arrows.properties
├── pages
├── _config.yml
└── assets
│ └── css
│ └── style.scss
└── test
├── kotlin
├── .gitignore
└── br
│ └── com
│ └── gamemods
│ └── j2nwc
│ ├── JsonTest.kt
│ └── RegionTest.kt
└── resources
└── r.1.-1.mca
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: 'Type: bug'
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Affected Version**
11 | The exact version number. Do not type latest, please be specific.
12 |
13 | **Describe the bug**
14 | A clear and concise description of what the bug is.
15 |
16 | **To Reproduce**
17 | Steps to reproduce the behavior:
18 | 1. Go to '...'
19 | 2. Click on '....'
20 | 3. Scroll down to '....'
21 | 4. See error
22 |
23 | **Expected behavior**
24 | A clear and concise description of what you expected to happen.
25 |
26 | **Exception stack trace**
27 | If applicable, paste it below to help explain your problem.
28 | ```java
29 | {{paste the exception stack trace here}}
30 | ```
31 |
32 | **Screenshots**
33 | If applicable, add screenshots to help explain your problem.
34 |
35 | **Additional context**
36 | Add any other context about the problem here.
37 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: 'Type: enhancement'
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle
2 | build
3 | *.iws
4 | *.ipr
5 | .idea
6 | nukkit-*.jar
7 | out
8 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "gh-pages"]
2 | path = gh-pages
3 | url = https://github.com/GameModsBR/Java2Nukkit-World-Converter.git
4 | branch = gh-pages
5 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 | All notable changes to this project will be documented in this file.
3 |
4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6 |
7 | ## [Unreleased]
8 | Click the link above to see the future.
9 |
10 | ### Fixes
11 | - [#88] Piston heads were being converted incorrectly
12 | - [#89] The -r parameter doesn't accept regions with position higher then 9
13 |
14 | ### Added
15 | - [#85] Support for converting to the PowerNukkit save format adding `--target powernukkit` to the arguments
16 |
17 | ## [3.0.0] - 2020-01-25
18 | ### Added
19 | - [#84] Mappings for Minecraft Java Edition 1.15 items and blocks
20 |
21 | ### Changed
22 | - `WorldConverter.convert()` now throws `IOException` in java **(breaking change)**
23 | - Updated [Region-Manipulator to `2.0.0`][Region 2.0.0] from `1.1.0` **(breaking change)**
24 | - [#84] The source world must be optimized by Minecraft 1.15.2 now
25 | - If the converter finds an unmapped block
26 | it will now be converted as 248:0 (minecraft:info_update) instead of 1:15 (stone with invalid data)
27 | - sweet_berries and shield are no longer replaced, they are obtainable in Nukkit 1.X now
28 | - Honey bottle and all banner patterns are no longer replaced, they aren't obtainable in Nukkit 1.X but
29 | the server won't break if you have these items in your inventory anymore.
30 |
31 | ### Fixes
32 | - [#78] Error parsing sign text: IllegalStateException: component must not be null
33 | - [#79] Region files with axis number (X or Z) higher then 9 being ignored
34 | - [#87] Double chests facing north and east have the contents swapped
35 | - Internal mappings for barrel, grindstone, lectern, stonecutter, bell, campfire, bee_nest and beehive.
36 | Does not affects the output because they aren't supported by Nukkit 1.X, so they were all replaced by other blocks.
37 |
38 | ## [2.0.1] - 2019-06-18
39 | ### Fixes
40 | - [#72] Some redstone wire states gets converted to other block improperly
41 | - [#73] Fixes the conversion for petrified oak slabs
42 | - [#74] Fixes `large_fern` becoming `sunflower` in inventories
43 | - [#75] Fixes dragon heads becomes skeleton skulls
44 |
45 | ## [2.0.0] - 2019-06-02
46 | ### Added
47 | - `WorldConveter.regions` to filter regions using the Region-Manipulator's `RegionPos`.
48 | - Type alias `RegionPosition` to help the conversion from the deprecated `RegionPos` to Region-Manipulator's `RegionPos`
49 | - `RegionPos.toRegionManipulator()` to convert the object to the equivalent's Region-Manipulator object.
50 | - `--keep-custom-heads` argument to keep converting the player heads with custom skins as regular player heads.
51 | - `WorldConverter.skipSkinHeads` if player heads with custom skins as regular player heads should be skipped.
52 |
53 | ### Changed
54 | - Updated [Region-Manipulator to `1.1.0`][Region 1.1.0] from `1.0.0`.
55 | - Deprecated `RegionPos`. Users should use the one provided by Region-Manipulator.
56 | - Deprecated `WorldConverter.regionFilter`. Users should use `WorldConverter.regions` instead.
57 | - Unmapped block states will now log a warning
58 | - Colored signs will be colored using text color instead of dye color. Some colors will be a little different and all
59 | them will be very bright.
60 | - [#54] Player heads with custom skins will now be skipped by default. This can be changed using `--keep-custom-heads` or `WorldConverter.skipSkinHeads`
61 | - [#59] `smooth_red_sandstone_slab` is now replaced with `red_sandstone_slab` instead of `acacia_slab`.
62 | - [#60] `red_nether_brick_stairs` is now replaced with `nether_brick_stairs` instead of `brick_stairs`.
63 | - [#63] `dark_prismarine_stairs` is now replaced with `stone_brick_stairs` instead of `cobblestone_stairs`.
64 |
65 | ### Fixed
66 | - [#38] The entire path is shown in Usage at --help
67 | - [#39] HeightMap is not converted properly
68 | - [#40] Biomes are not converted properly
69 | - Exceptions when converting optimized 1.8.8 to Nukkit. ([#41], [#42], [#43], [#44], [#45], [#46], [#47], [#48], [#66], [#67])
70 | - [#49] Nukkit crash due to an illegal conversion of generatorOption settings
71 | - [#50] waterloggable block states migrated from optimized 1.8.8 world becomes stone.
72 | - [#51] noteblocks migrated from optimized 1.8.8 world becomes stone.
73 | - [#52] generatorOptions conversion for flat worlds
74 | - [#53] The trapdoor placement and open/close state changes after conversion.
75 | - [#55] Signs are empty after the conversion.
76 | - [#56] The buttons placement and pressed state changes after conversion.
77 | - [#57] Stained glasses are becoming invisible bedrock.
78 | - [#58] `prismarine_brick_slab` and `dark_prismarine_slab` are swapped.
79 | - [#61], [#62] `nether_brick_wall` and `end_stone_brick_wall` are swapped.
80 | - [#64] Empty chunks being recreated.
81 | - [#68] Banners are not being completely converted
82 | - [#69], [#71] Incorrect block data manipulation by the item frame conversion causes nearby blocks to change.
83 | - [#70] Unmapped biome with id -107 (and other negative values)
84 |
85 | ## [1.0.0] - 2019-05-25
86 | ### Added
87 | - Support for Minecraft 1.14.1 to Nukkit [ccd5d78](https://github.com/NukkitX/Nukkit/tree/ccd5d78aee06d6097327dc825e32d10482c79043)
88 | - Conversion for block states to block/data
89 | - Conversion for items in inventories
90 | - Conversion for paintings
91 | - Conversion for item frames
92 | - Conversion for dropped items
93 | - Conversion for experience orbs
94 | - Conversion for falling blocks
95 | - Conversion for primed TNT
96 | - Small API for usage as library
97 | - Option specify the region files that will be converted
98 |
99 | [Unreleased]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/compare/v3.0.0...HEAD
100 | [3.0.0]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/compare/v2.0.1...v3.0.0
101 | [2.0.1]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/compare/v2.0.0...v2.0.1
102 | [2.0.0]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/compare/v1.0.0...v2.0.0
103 | [1.0.0]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/compare/a8f41900b32740648752ff214581eb8da0f928f6...v1.0.0
104 |
105 | [#38]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/38
106 | [#39]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/39
107 | [#40]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/40
108 | [#41]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/41
109 | [#42]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/42
110 | [#43]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/43
111 | [#44]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/44
112 | [#45]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/45
113 | [#46]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/46
114 | [#47]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/47
115 | [#48]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/48
116 | [#49]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/49
117 | [#50]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/50
118 | [#51]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/51
119 | [#52]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/52
120 | [#53]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/53
121 | [#54]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/54
122 | [#55]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/55
123 | [#56]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/56
124 | [#57]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/57
125 | [#58]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/58
126 | [#59]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/59
127 | [#60]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/60
128 | [#61]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/61
129 | [#62]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/62
130 | [#63]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/63
131 | [#64]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/64
132 | [#66]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/66
133 | [#67]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/67
134 | [#68]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/68
135 | [#69]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/69
136 | [#70]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/70
137 | [#71]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/71
138 |
139 | [#72]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/72
140 | [#73]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/73
141 | [#74]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/74
142 | [#75]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/75
143 |
144 | [#78]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/78
145 | [#79]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/79
146 | [#84]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/84
147 | [#87]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/87
148 |
149 | [#88]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/88
150 |
151 | [#85]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/85
152 | [#89]: https://github.com/GameModsBR/Java2Nukkit-World-Converter/issues/89
153 |
154 | [Region 2.0.0]: https://gamemodsbr.github.io/Region-Manipulator/CHANGELOG.html#200---2020-01-24
155 | [Region 1.1.0]: https://gamemodsbr.github.io/Region-Manipulator/CHANGELOG.html#110---2019-06-02
156 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2019 José Roberto de Araújo Júnior
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/MISSING_FEATURES.md:
--------------------------------------------------------------------------------
1 | # Missing Features
2 | Unfortunately not everything can be migrated, some things are not supported by the Minecraft Bedrock Edition, Nukkit
3 | or by the tool itself.
4 |
5 | Some to address this issue some items and blocks will be replaced by others and some others will be removed from the
6 | world.
7 |
8 | See also [the list of replaced blocks, items, entities and biomes](REPLACEMENTS.md).
9 |
10 | ## Unsupported by the tool
11 | These things could be converted but are not supported by the tool yet:
12 | * **Entities**: No entity will be converted, with exception of item frames which are blocks in Bedrock Edition
13 | * **Potion effects**: They will be converted as water potion for now
14 | * **Dropped items**: Will loose the `Owner` and `Thrower` tags because Java Edition accounts are not the same as Bedrock Edition accounts.
15 | * **Nether and The End**: Only overworld dimensions are supported for now
16 |
17 | ## Unsupported by Minecraft Bedrock Edition
18 | These things have some differences from Java Edition and needs to be treated specially:
19 | * **Item Frames**: They are block in Bedrock Edition, not entities, so they must not overlap any block
20 | to be converted, otherwise it will be skipped. Item Frames facing down or up aren`t supported by Bedrock Edition and will
21 | be ignored.
22 | * **Lever**: Java Edition allows you to place them facing north, south, east and west when place on the bottom
23 | or the top part of a block. Bedrock Edition only supports south or east in that condition, so levers pointing to north
24 | will point to south and levers pointing to west will point to east.
25 | * **Buttons**: Bedrock Edition doesn't allow you to place rotated buttons on the top or bottom face of a block.
26 | They will always face to north (the larger sides will be to east-west axis).
27 | * **HideFlags**: The tag is not supported, it will be migrated but it will be ignored by the client
28 | * **Debug Stick and customized states**: The block states in Bedrock Edition are not so customizable as it is in Java,
29 | so customized blocks may have theirs properties reversed, for example if you made a disconnected fence wall, they will
30 | be connected after the conversion
31 | * **Spawn Eggs**: which spawns unsupported entities will be black and won't spawn anything.
32 | * **Custom Player Head**: Player head with skins will be skipped by default. The Bedrock Edition doesn't support it.
33 | This can be changed using `--keep-custom-heads` or `WorldConverter.skipSkinHeads` so the player heads will be converted as regular heads (Steve skin).
34 | * **Blocks (+NBT)**: We are unable to pick blocks with it's NBT inside the item, so these blocks will loose the NBT tag.
35 | * **Written Books and Signs**: With custom events will loose their events as they are unsupported by Bedrock Edition (click and hover events)
36 | * **Big mushroom blocks**: doesn't have all possible states in Bedrock Edition. Only states which occur when a red big
37 | mushroom is grown are supported. Other custom states will be changed to show cap on all
38 | * **mushroom_stem**: will always be converted to the red mushroom stem as Java Edition has only one block type for both
39 | mushrooms while Bedrock Edition has stems for each of them.
40 | * **Tipped Arrow**: of type strong_slowness (-60% Speed) isn't supported by Bedrock Edition and will be converted to normal slowness.
41 | * **Spectral Arrow**: is missing on Bedrock Edition and will be converted to regular arrows
42 | * **Fireworks rockets and stars**: with customized colors will always be converted to blue because it's not supported by Bedrock Edition.
43 | * **Suspicious Stew**: Is not available in Bedrock Edition and will be converted to a normal mushroom stew
44 | * **All potions types**: Custom effects and colors aren't supported and they will revert back to the normal potion indicated in the `Potion` NBT tag.
45 | Also, some potions aren't supported and they will be converted as stated in the [replacements file](REPLACEMENTS.md)
46 | * **Colored signs**: They are unsupported by Bedrock but the tool will convert the color using the text color system instead
47 | of the dye colors. Some colors will be a little different and all them will be very bright.
48 | Brown is missing so it will be red and there are two pinks (magenta and pink).
49 |
50 | ## Unsupported by Nukkit
51 | These things won't work because it's a missing feature or a bug in Nukkit servers:
52 | * **Pistons**: All pistons will loose their head and will not work at all.
53 | * **Dispensers**: They will always face the same direction and will not work.
54 | * **Water-logging**: All water-logged blocks will loose they water on conversion.
55 | * **Spawn Eggs**: Custom JSON values for entities will not work.
56 | * **Book and Quill**: Writable Books will be converted and will be readable but won't be editable.
57 | * **Attribute Modifiers**: Nukkit doesn't seems to have any support to attribute modifiers.
58 | * **Falling Block**: Will not hurt entities on landing. Nukkit also supports only the block id and data value so
59 | `TileEntityData`, `Time`, `DropItem`, `HurtEntities`, `FallHurtMax` and `FallHurtAmount` will be ignored.
60 | * **Experience orbs**: Will be migrated but will loose it's value because Nukkit does not save and neither load it,
61 | so collecting it will give nothing.
62 | * **Open maps**: They are not supported by Nukkit so no map content will be migrated
63 | * **Biomes**: Biomes related to the end and oceans from aquatic update aren't supported and will be replaced by similar biomes.
64 | * **generatorOptions**: Is only supported by FLAT worlds without the structures and custom options sections. The blocks and biomes will be converted properly.
65 | * **Banners**: Nukkit does not send the patterns to the players, so they will see an empty colored banner.
66 | This will be fixed once [this pull request](https://github.com/NukkitX/Nukkit/pull/735) gets accepted.
67 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Minecraft Java to Nukkit World Converter
2 | This is a command line tool that will convert Minecraft 1.15.2 anvil worlds to Nukkit's anvil world format.
3 |
4 | Please check the [missing features file](MISSING_FEATURES.md) to be aware of everything that is not supported by
5 | Bedrock Edition or Nukkit.
6 |
7 | Also take a look at the [replacements file](REPLACEMENTS.md) to be aware of all block and items replacements that are
8 | done due to the lack of support by Nukkit or Bedrock Edition.
9 |
10 | You may also want to see the [changelog](CHANGELOG.md) file to be aware of all changes in the tool that may impact you.
11 |
12 | ## Requeriments
13 | Before you convert you need to optimize your world using Minecraft 1.15.2.
14 |
15 | This tool only supports Minecraft Java Edition 1.15.2, other versions and unoptimized worlds in different versions
16 | may cause incorrect conversions or crashes during the conversion.
17 |
18 | You will also need Java 1.8+ to executed the tool. It will work in all platforms supported by Java,
19 | this means Windows, Linux, Mac OS, and more are supported.
20 |
21 | ### How do I know if a world is optimized?
22 | When you open a world that was created in an older version of Minecraft, the game will slowly update the chunks
23 | to the version that you are running the game as you walk. It will only update the chunks that you loaded while walking.
24 |
25 | If you created the world in the same Minecraft version that you are playing, than the world is already optimized to that
26 | version because it won't have old chunks.
27 |
28 | If you are in doubt, optimize it.
29 |
30 | ### How do I optimize worlds
31 | The game offers an option to eagerly update all chunks in the world at once.
32 |
33 | To use that follow these steps:
34 |
35 | 1. Click the `Singleplayer` button in the main menu
36 | 2. Select the world without opening it
37 | 3. Click the `Edit` button
38 | 4. Click the `Optimize World` button
39 | 5. Click the `Backup and load` button
40 | 6. Wait until it finishes
41 | 7. Congratulations! Your world is now optimized.
42 |
43 | ## Liability and Warranty
44 | This tool is distributed under [MIT License](LICENSE), this means that we give no warranty and take no responsibility to
45 | any damage that this tool may cause. Please read [the license terms](LICENSE) for more details.
46 |
47 | Most of the mappings were also made manually and humans are subject to errors. If you find any block or item being
48 | converted to other item or block and which that conversion isn't reported [in the replacements file](REPLACEMENTS.md),
49 | please, report it in the issues section, or, attempt to fix the mapping in the properties files and create a pull request.
50 |
51 | ## How to run?
52 | Simply open your favorite terminal/console application, cmd.exe for example, navigate to the folder that you have
53 | downloaded the tool and execute this command:
54 | ```batch
55 | java -jar TheToolJarFile.jar "C:\Path\To\The\Java\World\Dir" "C:\Where\The\Converted\Folder\Will\Be"
56 | ```
57 |
58 | Don't forget to replace the directory paths and the tool jar file name.
59 |
60 | ## How do I build the project?
61 | Just open your terminal software, cmd.exe for example, navigate to inside the project directory and type:
62 |
63 | If you are on Linux/Unix:
64 | ```sh
65 | chmod a+x ./gradlew
66 | ./gradlew build
67 | ```
68 |
69 | If you are on Windows:
70 | ```sh
71 | gradlew.bat build
72 | ```
73 |
74 | The JAR file will be inside the `build/libs` folder. Use the one which ends with `-cli`
75 |
76 | ## I have a question or I want to talk about the tool
77 | Open an issue, it will be flagged as question or dialog and I it will be replied soon.
78 |
79 | ## Can I use it as library?
80 | Yes you can!
81 |
82 | Currently this tool is shared to jcenter, so make sure you have it in your repository list.
83 |
84 | The API is very simple now and doesn't allows customizations. It can be used both on Kotlin and Java.
85 |
86 | Here you can find the API documentation:
87 | * [Java Documentation](https://gamemodsbr.github.io/Java2Nukkit-World-Converter/javadoc)
88 | * [Kotlin Documentation](https://gamemodsbr.github.io/Java2Nukkit-World-Converter/kdoc/br.com.gamemods.j2nwc/)
89 |
90 |
91 | ### Examples
92 |
93 | #### Kotlin
94 | ```kotlin
95 | val converter = WorldConverter(
96 | from = File("""Z:\Users\Fake\.minecraft\saves\Fake World"""),
97 | to = File("""Z:\Fake\Nukkit\Server\worlds\FakeWorld""")
98 | )
99 |
100 | // Allows you to specify which region will be converter
101 | // useful for debugging, if not changed will convert everything
102 | converter.regionFilter = mutableSetOf(RegionPos(0,0), RegionPos(-1,0))
103 |
104 | // Executes the conversion
105 | converter.convert()
106 | ```
107 | #### Java
108 | ```java
109 | WorldConverter converter = new WorldConverter(
110 | new File("Z:\\Users\\Fake\\.minecraft\\saves\\Fake World"),
111 | new File("Z:\\Fake\\Nukkit\\Server\\worlds\\FakeWorld")
112 | );
113 |
114 | // Allows you to specify which region will be converter
115 | // useful for debugging, if not changed will convert everything
116 | converter.regionFilter = new HashSet<>(Arrays.asList(new RegionPos(0,0), new RegionPos(-1,0)));
117 |
118 | // Executes the conversion
119 | converter.convert();
120 | ```
121 |
122 |
123 | #### Calling as CLI
124 | You can also call it as CLI:
125 | ```kotlin
126 | WorldConverterCLI.main(
127 | """Z:\Users\Fake\.minecraft\saves\Fake World""",
128 | """Z:\Fake\Nukkit\Server\worlds\FakeWorld"""
129 | )
130 | ```
131 |
132 | ### Adding as dependency
133 | The tool is shared on jcenter but it has dependencies that are on different repositories.
134 |
135 | Make sure you have add all repositories listed below
136 | #### Gradle
137 | ```groovy
138 | repositories {
139 | jcenter()
140 | maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' }
141 | maven { url 'https://dl.bintray.com/orangy/maven' }
142 | }
143 |
144 | dependencies {
145 | compile 'br.com.gamemods:java2nukkit-world-converter:3.0.0'
146 | }
147 | ```
148 |
149 | ### Maven
150 | ```xml
151 |
152 |
153 | jcenter
154 | https://jcenter.bintray.com/
155 |
156 |
157 | spigotmc
158 | https://hub.spigotmc.org/nexus/content/groups/public/
159 |
160 |
161 | kotlinx-cli
162 | https://dl.bintray.com/orangy/maven
163 |
164 |
165 |
166 |
167 | br.com.gamemods
168 | java2nukkit-world-converter
169 | 3.0.0
170 |
171 |
172 | ```
173 |
174 | ### Ivy
175 | ```xml
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 | ```
185 |
--------------------------------------------------------------------------------
/REPLACEMENTS.md:
--------------------------------------------------------------------------------
1 | # Replacements
2 | This file lists all things that cannot be migrated to Nukkit and was replaced by other.
3 |
4 | See also [the list of missing features](MISSING_FEATURES.md).
5 |
6 | ## Items
7 |
8 | | Name | Replacement | Unsupported by |
9 | | ---------------------- | ------------- | --------------- |
10 | | spruce_sign | oak_sign | Nukkit 1.X |
11 | | birch_sign | oak_sign | Nukkit 1.X |
12 | | jungle_sign | oak_sign | Nukkit 1.X |
13 | | acacia_sign | oak_sign | Nukkit 1.X |
14 | | dark_oak_sign | oak_sign | Nukkit 1.X |
15 | | crossbow | bow | Nukkit 1.X |
16 | | Potions of Slowness IV | Potion of Slowness I | Bedrock Edition |
17 | | Uncraftable Potion | Water Potion | Bedrock Edition |
18 | | Potions of Lucky | Water Potion | Bedrock Edition |
19 | | Arrow of Slowness IV | Arrow of Slowness I | Bedrock Edition |
20 | | Arrow of Lucky | Regular Arrow | Bedrock Edition |
21 | | Spectral Arrow | Regular Arrow | Bedrock Edition |
22 |
23 | ## Blocks
24 |
25 | | Name | Replacement | Unsupported by |
26 | | ----------------------- | -------------- | --------------- |
27 | | wither_rose | air | Bedrock Edition |
28 | | structure_void | air | Bedrock Edition |
29 | | void_air | air | Bedrock Edition |
30 | | cave_air | air | Bedrock Edition |
31 | | dead_tube_coral (in water) | water | Bedrock Edition |
32 | | dead_tube_coral (in air) | air | Bedrock Edition |
33 | | dead_brain_coral (in water) | water | Bedrock Edition |
34 | | dead_brain_coral (in air) | air | Bedrock Edition |
35 | | dead_fire_coral (in water) | water | Bedrock Edition |
36 | | dead_fire_coral (in air) | air | Bedrock Edition |
37 | | dead_horn_coral (in water) | water | Bedrock Edition |
38 | | dead_horn_coral (in air) | air | Bedrock Edition |
39 | | item_frame (facing down/up) | air | Bedrock Edition |
40 | | command | crafting_table | Nukkit 1.X |
41 | | repeating_command_block | crafting | Nukkit 1.X |
42 | | chain_command_block | crafting | Nukkit 1.X |
43 | | structure_block | purpur_block | Nukkit 1.X |
44 | | seagrass | water | Nukkit 1.X |
45 | | kelp (block) | water | Nukkit 1.X |
46 | | bubble_column | water | Nukkit 1.X |
47 | | bamboo | sugarcane | Nukkit 1.X |
48 | | bamboo_sapling | sugarcane | Nukkit 1.X |
49 | | scaffolding | ladder (floating) | Nukkit 1.X |
50 | | mossy_stone_brick_slab | stone_brick_slab | Nukkit 1.X |
51 | | smooth_quartz_slab | quartz_slab | Nukkit 1.X |
52 | | stone_slab | smooth_stone_slab | Nukkit 1.X |
53 | | cut_sandstone_slab | sandstone_slab | Nukkit 1.X |
54 | | cut_red_sandstone_slab | red_sandstone_slab| Nukkit 1.X |
55 | | smooth_stone | smooth_stone_slab (double) | Nukkit 1.X |
56 | | spruce_sign | oak_sign | Nukkit 1.X |
57 | | spruce_wall_sign | oak_wall_sign | Nukkit 1.X |
58 | | spruce_wall_sign | oak_wall_sign | Nukkit 1.X |
59 | | birch_sign | oak_sign | Nukkit 1.X |
60 | | birch_wall_sign | oak_wall_sign | Nukkit 1.X |
61 | | jungle_sign | oak_sign | Nukkit 1.X |
62 | | jungle_wall_sign | oak_wall_sign | Nukkit 1.X |
63 | | acacia_sign | oak_sign | Nukkit 1.X |
64 | | acacia_wall_sign | oak_wall_sign | Nukkit 1.X |
65 | | dark_oak_sign | oak_sign | Nukkit 1.X |
66 | | dark_oak_wall_sign | oak_wall_sign | Nukkit 1.X |
67 | | grindstone | crafting_table | Nukkit 1.X |
68 | | smoker | furnace | Nukkit 1.X |
69 | | cartography_table | crafting_table | Nukkit 1.X |
70 | | barrel | chest (always closed) | Nukkit 1.X |
71 | | sweet_berry_bush | grass | Nukkit 1.X |
72 | | campfire (lit) | magma | Nukkit 1.X |
73 | | campfire (unlit) | obsidian | Nukkit 1.X |
74 | | jigsaw | purpur_block | Nukkit 1.X |
75 | | lantern (floor) | standing torch | Nukkit 1.X |
76 | | lantern (celling) | glowstone | Nukkit 1.X |
77 | | lectern | crafting_table | Nukkit 1.X |
78 | | blast_furnace | furnace | Nukkit 1.X |
79 | | fletching_table | crafting_table | Nukkit 1.X |
80 | | smithing_table | crafting_table | Nukkit 1.X |
81 | | stone_cutter | enchanting_table | Nukkit 1.X |
82 | | loom | crafting_table | Nukkit 1.X |
83 | | composter | cauldron | Nukkit 1.X |
84 | | bell (on floor) | anvil | Nukkit 1.X |
85 | | bell (on wall and celling) | stone brick wall | Nukkit 1.X |
86 | | prismarine_stairs | cobblestone_stairs | Nukkit 1.X |
87 | | dark_prismarine_stairs | stone_brick_stairs | Nukkit 1.X |
88 | | prismarine_brick_stairs | mossy_stone_brick_stairs | Nukkit 1.X |
89 | | stripped_spruce_log | spruce_log | Nukkit 1.X |
90 | | stripped_birch_log | birch_log | Nukkit 1.X |
91 | | stripped_jungle_log | jungle_log | Nukkit 1.X |
92 | | stripped_acacia_log | acacia_log | Nukkit 1.X |
93 | | stripped_dark_oak_log | dark_oak_log | Nukkit 1.X |
94 | | stripped_oak_log | oak_log | Nukkit 1.X |
95 | | blue_ice | packed_ice | Nukkit 1.X |
96 | | tube_coral | water | Nukkit 1.X |
97 | | tube_coral_block | water | Nukkit 1.X |
98 | | tube_coral_fan | water | Nukkit 1.X |
99 | | bubble_coral_wall_fan | water | Nukkit 1.X |
100 | | horn_coral_wall_fan | water | Nukkit 1.X |
101 | | dried_kelp_block | coal_block | Nukkit 1.X |
102 | | acacia_button | oak_button | Nukkit 1.X |
103 | | birch_button | oak_button | Nukkit 1.X |
104 | | dark_oak_button | oak_button | Nukkit 1.X |
105 | | jungle_button | oak_button | Nukkit 1.X |
106 | | spruce_button | oak_button | Nukkit 1.X |
107 | | acacia_trapdoor | oak_trapdoor | Nukkit 1.X |
108 | | birch_trapdoor | oak_trapdoor | Nukkit 1.X |
109 | | jungle_trapdoor | oak_trapdoor | Nukkit 1.X |
110 | | acacia_pressure_plate | oak_pressure_plate| Nukkit 1.X |
111 | | birch_pressure_plate | oak_pressure_plate| Nukkit 1.X |
112 | | dark_oak_pressure_plate | oak_pressure_plate| Nukkit 1.X |
113 | | jungle_pressure_plate | oak_pressure_plate| Nukkit 1.X |
114 | | spruce_pressure_plate | oak_pressure_plate| Nukkit 1.X |
115 | | carved_pumpkin | pumpkin | Nukkit 1.X |
116 | | sea_pickle (waterlogged)| water | Nukkit 1.X |
117 | | sea_pickle (non-water) | air | Nukkit 1.X |
118 | | conduit | water | Nukkit 1.X |
119 | | turtle_egg | air | Nukkit 1.X |
120 | | end_stone_brick_slab | smooth_sandstone_slab | Nukkit 1.X |
121 | | smooth_red_sandstone_slab | red_sandstone_slab | Nukkit 1.X |
122 | | polished_andesite_slab | smooth_stone_slab | Nukkit 1.X |
123 | | andesite_slab | smooth_stone_slab | Nukkit 1.X |
124 | | diorite_slab | quartz_slab | Nukkit 1.X |
125 | | polished_diorite_slab | quartz_slab | Nukkit 1.X |
126 | | granite_slab | brick_slab | Nukkit 1.X |
127 | | granite_slab | brick_slab | Nukkit 1.X |
128 | | polished_granite_slab | red_sandstone_slab| Nukkit 1.X |
129 | | polished_granite_slab | red_sandstone_slab| Nukkit 1.X |
130 | | granite_stairs | brick_stairs | Nukkit 1.X |
131 | | diorite_stairs | brick_stairs | Nukkit 1.X |
132 | | andesite_stairs | cobblestone_stairs| Nukkit 1.X |
133 | | polished_granite_stairs | red_sandstone_stairs| Nukkit 1.X |
134 | | polished_diorite_stairs | brick_stairs | Nukkit 1.X |
135 | | polished_andesite_stairs | stone_brick_stairs | Nukkit 1.X |
136 | | mossy_stone_brick_stairs | stone_brick_stairs | Nukkit 1.X |
137 | | smooth_red_sandstone_stairs | red_sandstone_stairs | Nukkit 1.X |
138 | | smooth_sandstone_stairs | sandstone_stairs | Nukkit 1.X |
139 | | end_stone_brick_stairs | sandstone_stairs | Nukkit 1.X |
140 | | mossy_coblestone_stairs | cobblestone_stairs| Nukkit 1.X |
141 | | stone_stairs | stone_brick_stairs| Nukkit 1.X |
142 | | red_nether_brick_stairs | nether_brick_stairs | Nukkit 1.X |
143 | | smooth_quartz_stairs | quartz_stairs | Nukkit 1.X |
144 | | barrier | invisible_bedrock | Nukkit 1.X |
145 | | dark_oak_trapdoor | oak_trapdoor | Nukkit 1.X |
146 | | spruce_trapdoor | oak_trapdoor | Nukkit 1.X |
147 | | bee_nest | air | Nukkit 1.X |
148 | | beehive | oak_planks | Nukkit 1.X |
149 | | honey_block | slime_block | Nukkit 1.X |
150 | | honeycomb_block | yellow_glazed_terracotta | Nukkit 1.X |
151 | | stickypistonarmcollision | pistonarmcollision | Nukkit 1.X |
152 |
153 | ## Entities
154 |
155 | | Name | Replacement | Unsupported by |
156 | | ----------------------- | -------------- | --------------- |
157 | | spectral_arrow | arrow | Bedrock Edition |
158 |
159 |
160 | ## Biomes
161 |
162 | | Name | Replacement | Unsupported by |
163 | | ----------------------- | -------------- | --------------- |
164 | | the_end | nether | Nukkit 1.X |
165 | | end_midlands | nether | Nukkit 1.X |
166 | | end_highlands | nether | Nukkit 1.X |
167 | | end_barrens | nether | Nukkit 1.X |
168 | | warm_ocean | ocean | Nukkit 1.X |
169 | | lukewarm_ocean | ocean | Nukkit 1.X |
170 | | cold_ocean | ocean | Nukkit 1.X |
171 | | deep_warm_ocean | deep_ocean | Nukkit 1.X |
172 | | deep_lukewarm_ocean | deep_ocean | Nukkit 1.X |
173 | | deep_cold_ocean | deep_ocean | Nukkit 1.X |
174 | | the_void | plains | Nukkit 1.X |
175 | | snowy_mountains | snowy_tundra | Nukkit 1.X |
176 | | bamboo_jungle | jungle | Nukkit 1.X |
177 | | bamboo_jungle_hills | jungle_hills | Nukkit 1.X |
178 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'org.jetbrains.kotlin.jvm' version '1.3.61'
3 | id 'com.jfrog.bintray' version '1.8.4'
4 | id 'maven'
5 | id 'org.jetbrains.dokka' version '0.9.18'
6 | id 'org.ajoberstar.git-publish' version '2.1.1'
7 | id 'com.github.johnrengelman.shadow' version '5.0.0'
8 | }
9 |
10 | group 'br.com.gamemods'
11 | version '3.1.0-SNAPSHOT'
12 |
13 | sourceSets.main.java.srcDirs = ["src/main/kotlin"]
14 | sourceSets.test.java.srcDirs = ["src/test/kotlin"]
15 |
16 | sourceCompatibility = 1.8
17 | targetCompatibility = sourceCompatibility
18 |
19 | repositories {
20 | jcenter()
21 | maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' }
22 | maven { url 'https://dl.bintray.com/orangy/maven' }
23 | }
24 |
25 | dependencies {
26 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
27 | implementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect'
28 | implementation group: 'net.md-5', name: 'bungeecord-chat', version: '1.15-SNAPSHOT'
29 | compile 'br.com.gamemods:region-manipulator:2.0.0'
30 | implementation 'org.jetbrains.kotlinx:kotlinx-cli-jvm:0.1.0-dev-4'
31 | testCompile group: 'junit', name: 'junit', version: '4.12'
32 | }
33 |
34 | compileKotlin {
35 | kotlinOptions.jvmTarget = "1.8"
36 | }
37 | compileTestKotlin {
38 | kotlinOptions.jvmTarget = "1.8"
39 | }
40 |
41 | install {
42 | repositories.mavenInstaller {
43 | pom.project {
44 | packaging 'jar'
45 | groupId project.group
46 | artifactId 'java2nukkit-world-converter'
47 | version project.version
48 | name project.name
49 | description "Converts worlds from Minecraft 1.14+ Java Edition to the newest Nukkit MCA file format"
50 | url "https://github.com/GameModsBR/Java2Nukkit-World-Converter"
51 | inceptionYear '2019'
52 | licenses {
53 | license {
54 | name 'MIT'
55 | url 'https://raw.githubusercontent.com/GameModsBR/Java2Nukkit-World-Converter/master/LICENSE'
56 | distribution 'repo'
57 | }
58 | }
59 | developers {
60 | developer {
61 | id = 'joserobjr'
62 | name = 'José Roberto de Araújo Júnior'
63 | email = 'joserobjr@gamemods.com.br'
64 | }
65 | }
66 | scm {
67 | connection "https://github.com/GameModsBR/Java2Nukkit-World-Converter.git"
68 | developerConnection "https://github.com/GameModsBR/Java2Nukkit-World-Converter.git"
69 | url "https://github.com/GameModsBR/Java2Nukkit-World-Converter"
70 | }
71 | }
72 | }
73 | }
74 |
75 | if (!ext.has('gamemodsBintrayUser')) {
76 | ext.gamemodsBintrayUser = ""
77 | }
78 | if (!ext.has('gamemodsBintrayApiKey')) {
79 | ext.gamemodsBintrayApiKey = ""
80 | }
81 |
82 | bintray {
83 | user = "$gamemodsBintrayUser"
84 | key = "$gamemodsBintrayApiKey"
85 | configurations = ['archives']
86 | pkg {
87 | repo = 'GameMods'
88 | name = 'Java2Nukkit-World-Converter'
89 | userOrg = 'gamemods'
90 | licenses = ['MIT']
91 | vcsUrl = 'https://github.com/GameModsBR/Java2Nukkit-World-Converter.git'
92 | websiteUrl = 'https://github.com/GameModsBR/Java2Nukkit-World-Converter'
93 | //publish = false
94 | version {
95 | name = project.version
96 | desc = "Java2Nukkit-World-Converter version ${project.version}"
97 | //released = new Date()
98 | vcsTag = "v${project.version}"
99 | gpg {
100 | sign = true //Determines whether to GPG sign the files. The default is false
101 | //passphrase = '123' //Optional. The passphrase for GPG signing'
102 | }
103 | }
104 | }
105 | }
106 |
107 | jar {
108 | from file("$projectDir/LICENSE")
109 | }
110 |
111 | task dokkaJavadoc(type: org.jetbrains.dokka.gradle.DokkaTask) {
112 | outputFormat = 'javadoc'
113 | outputDirectory = "$buildDir/javadoc"
114 | }
115 |
116 | task javadocJar(type: Jar, dependsOn: dokkaJavadoc) {
117 | archiveClassifier.set('javadoc')
118 | from dokkaJavadoc.outputDirectory
119 | from file("$projectDir/LICENSE")
120 | from file("$projectDir/README.md")
121 | from file("$projectDir/CHANGELOG.md")
122 | from file("$projectDir/REPLACEMENTS.md")
123 | from file("$projectDir/MISSING_FEATURES.md")
124 | // options.encoding = 'UTF-8'
125 | }
126 |
127 |
128 | task dokkaKdoc(type: org.jetbrains.dokka.gradle.DokkaTask) {
129 | outputFormat = 'gfm'
130 | outputDirectory = "$buildDir/kdoc"
131 | }
132 |
133 | import java.nio.file.Files
134 | import java.nio.file.Paths
135 | import java.nio.file.StandardCopyOption
136 | task createReadmeFiles(dependsOn: dokkaKdoc) {
137 | doFirst {
138 | Files.walk(Paths.get(dokkaKdoc.outputDirectory))
139 | .filter { it.getFileName().toString().toLowerCase() == "index.md" }
140 | .forEach {
141 | try {
142 | Files.copy(it, it.resolveSibling("README.md"), StandardCopyOption.REPLACE_EXISTING)
143 | } catch (Throwable e) {
144 | throw new RuntimeException(e)
145 | }
146 | }
147 | }
148 | }
149 |
150 | task createIndexMd(type: Copy) {
151 | from file("$projectDir/README.md")
152 | into "$buildDir/pages"
153 | rename 'README.md', 'index.md'
154 | }
155 |
156 | task sourcesJar(type: Jar) {
157 | from sourceSets.main.java.srcDirs
158 | from file("$projectDir/build.gradle")
159 | from file("$projectDir/gradle.properties")
160 | from file("$projectDir/settings.gradle")
161 | from file("$projectDir/LICENSE")
162 | from file("$projectDir/README.md")
163 | from file("$projectDir/CHANGELOG.md")
164 | from file("$projectDir/REPLACEMENTS.md")
165 | from file("$projectDir/MISSING_FEATURES.md")
166 | archiveClassifier.set('sources')
167 | }
168 |
169 | artifacts {
170 | archives sourcesJar
171 | }
172 |
173 | // dokka will fail to build the javadoc jar on newest java versions
174 | // https://github.com/Kotlin/dokka/issues/294
175 | if (JavaVersion.current().majorVersion == "8") {
176 | artifacts {
177 | archives javadocJar
178 | }
179 |
180 | dokka {
181 | packageOptions {
182 | prefix = "br.com.gamemods.j2nwc.internal"
183 | suppress = true
184 | }
185 | }
186 |
187 | if (ext.has('org.ajoberstar.grgit.auth.username')) {
188 | System.setProperty('org.ajoberstar.grgit.auth.username', ext['org.ajoberstar.grgit.auth.username'].toString())
189 | System.setProperty('org.ajoberstar.grgit.auth.password', ext['org.ajoberstar.grgit.auth.password'].toString())
190 | }
191 |
192 | gitPublish {
193 | // where to publish to (repo must exist)
194 | repoUri = 'https://github.com/GameModsBR/Java2Nukkit-World-Converter.git'
195 |
196 | // where to fetch from prior to fetching from the remote (i.e. a local repo to save time)
197 | referenceRepoUri = file("$projectDir/gh-pages").toURI().toString()
198 |
199 | // branch will be created if it doesn't exist
200 | branch = 'gh-pages'
201 |
202 | // generally, you don't need to touch this
203 | repoDir = file("$buildDir/gh-pages-repo") // defaults to $buildDir/gitPublish
204 |
205 | // what to publish, this is a standard CopySpec
206 | contents {
207 | from("$buildDir/javadoc") {
208 | into 'javadoc'
209 | }
210 | from("$buildDir/kdoc") {
211 | into 'kdoc'
212 | }
213 | from "$buildDir/pages"
214 | from 'src/pages'
215 | from 'README.md'
216 | from 'MISSING_FEATURES.md'
217 | from 'REPLACEMENTS.md'
218 | from 'CHANGELOG.md'
219 | }
220 |
221 | // what to keep in the existing branch (include=keep)
222 | preserve {
223 | include '1.0.0/**'
224 | exclude '1.0.0/temp.txt'
225 | }
226 |
227 | // message used when committing changes
228 | commitMessage = 'Github Pages update' // defaults to 'Generated by gradle-git-publish'
229 | }
230 | }
231 |
232 | gitPublishCopy.dependsOn dokkaJavadoc
233 | gitPublishCopy.dependsOn createReadmeFiles
234 | gitPublishCopy.dependsOn createIndexMd
235 |
236 | shadowJar {
237 | archiveClassifier.set('cli')
238 | manifest {
239 | attributes 'Main-Class': 'br.com.gamemods.j2nwc.WorldConverterCLI'
240 | }
241 | from file("$projectDir/README.md")
242 | from file("$projectDir/CHANGELOG.md")
243 | from file("$projectDir/REPLACEMENTS.md")
244 | from file("$projectDir/MISSING_FEATURES.md")
245 | }
246 |
247 | build.finalizedBy shadowJar
248 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | kotlin.code.style=official
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PowerNukkit/Java2Nukkit-World-Converter/8d154d1e4bae336cd2e4542a4d2bb4cc98f9e291/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name = 'Java2Nukkit-World-Converter'
2 |
3 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/WorldConverter.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc
2 |
3 | import br.com.gamemods.j2nwc.internal.*
4 | import java.io.File
5 | import java.io.IOException
6 |
7 | /**
8 | * A region position extracted from the region file name.
9 | *
10 | * `r.-2.3.mca` must be `Region(-2,3)` for example
11 | * @property xPos The first number in the region file name. May be negative.
12 | * @property zPos The second number in the region file name. May be negative.
13 | */
14 | @Deprecated(
15 | "Already provided by Region-Manipulator",
16 | ReplaceWith("RegionPosition", "br.com.gamemods.j2nwc.RegionPosition")
17 | )
18 | data class RegionPos
19 | @Deprecated(
20 | "Already provided by Region-Manipulator",
21 | ReplaceWith("RegionPosition(xPos, zPos)", "br.com.gamemods.j2nwc.RegionPosition")
22 | )
23 | constructor (val xPos: Int, val zPos: Int) {
24 |
25 | @Suppress("DEPRECATION")
26 | private constructor(mcaFileNameParts: List): this(mcaFileNameParts[1].toInt(), mcaFileNameParts[2].toInt())
27 |
28 | /**
29 | * Parses a region file name. Only support valid names like `r.-3.2.mca`.
30 | * @param mcaFileName A valid file name
31 | */
32 | @Deprecated(
33 | "Already provided by Region-Manipulator",
34 | ReplaceWith("RegionPosition(mcaFileName)", "br.com.gamemods.j2nwc.RegionPosition")
35 | )
36 | constructor(mcaFileName: String): this(mcaFileName.split('.'))
37 |
38 | /**
39 | * Converts this deprecated object to it's replacement.
40 | */
41 | fun toRegionManipulator() = RegionPosition(xPos, zPos)
42 | }
43 |
44 | /**
45 | * A region position extracted from the region file name.
46 | *
47 | * `r.-2.3.mca` must be `Region(-2,3)` for example
48 | */
49 | typealias RegionPosition = br.com.gamemods.regionmanipulator.RegionPos
50 |
51 | /**
52 | * Prepare a conversion from a Java World 1.14+ to Nukkit.
53 | *
54 | * Please check [this page](https://gamemodsbr.github.io/Java2Nukkit-World-Converter/) for details about the requirements and expectations.
55 | * @property from The Java world folder
56 | * @property to The world folder that will be created for the Nukkit's world
57 | */
58 | class WorldConverter(val from: File, val to: File) {
59 | /**
60 | * A collection which determines which region files will be converted. When empty all regions are converted.
61 | */
62 | @Suppress("DEPRECATION")
63 | @Deprecated(
64 | "Uses a duplicated type, please use regions instead",
65 | ReplaceWith("regions")
66 | )
67 | var regionFilter = mutableSetOf()
68 |
69 | /**
70 | * A collection which determines which region files will be converted. When empty all regions are converted.
71 | */
72 | var regions = mutableSetOf()
73 |
74 | /**
75 | * Determines if player heads which contains custom skins should be skipped.
76 | *
77 | * Player heads without skins are unaffected.
78 | */
79 | var skipSkinHeads = true
80 |
81 | /**
82 | * The level format which will be used by the converted world.
83 | */
84 | var targetType = TargetType.NUKKIT
85 |
86 | /**
87 | * Executes the conversion in the current thread. Will take a while to complete.
88 | *
89 | * @throws IOException If an error occurs while loading or writing the files
90 | */
91 | @Throws(IOException::class)
92 | fun convert() {
93 | check(to.isDirectory || to.mkdirs()) {
94 | "Failed to create the folder $to"
95 | }
96 |
97 | convertLevelFile(File(from, "level.dat"), File(to, "level.dat"), this)
98 |
99 | val toRegionDir = File(to, "region")
100 | toRegionDir.mkdirs()
101 | val worldHooks = mutableListOf()
102 | @Suppress("DEPRECATION")
103 | val regions = (regions + regionFilter.map { it.toRegionManipulator() }).toSet()
104 | checkNotNull(File(from, "region").listFiles(), { "$from is not a directory" }).asSequence()
105 | .filter { it.name.toLowerCase().matches(Regex("""^r\.-?\d+\.-?\d+\.mca$""")) }
106 | .filter { regions.isEmpty() || RegionPosition(it.name) in regions }
107 | .forEach { fromRegion ->
108 | convertRegionFile(
109 | fromRegion,
110 | File(toRegionDir, fromRegion.name),
111 | worldHooks,
112 | this
113 | )
114 | }
115 | worldHooks.forEach {
116 | it(from, to)
117 | }
118 | }
119 |
120 | /**
121 | * The targeted save format that will be written in the output.
122 | */
123 | enum class TargetType(
124 | val maxBlockId: Int,
125 | val maxDataValue: Int,
126 | conversionMappings: String,
127 | blockIdsFile: String,
128 | itemIdsFile: String,
129 | val suprpessWarningItemIds: Set = emptySet()
130 | ) {
131 | /**
132 | * Supports Nukkit 1.X. Has Block ID limited to 255, blocks with higher ID will be removed or remapped to a similar block.
133 | *
134 | * PowerNukkit 1.X accepts this format normally.
135 | *
136 | * Nukkit 2.X and PowerNukkit 2.X accepts this format but will converto to LevelDB on load.
137 | */
138 | NUKKIT(255, 15, "/bedrock-2-nukkit.properties", "/nukkit-block-ids.properties", "/nukkit-item-ids.properties",
139 | setOf(434, 736, 737)),
140 |
141 | /**
142 | * Supports PowerNukkit 1.X. Doesn't have the Block ID limitation and almost all blocks will match the original world.
143 | *
144 | * Nukkit 1.X will reset chunks which contains waterlogged blocks and blocks with ID > 255 and log them as corrupt chunks.
145 | *
146 | * The behaviour of Nukkit 2.X with this format is unknown.
147 | *
148 | * PowerNukkit 2.X accepts this format but will convert to LevelDB on load.
149 | */
150 | POWER_NUKKIT(512, 63, "/bedrock-2-powernukkit.properties", "/powernukkit-block-ids.properties", "/powernukkit-item-ids.properties",
151 | setOf(434)),
152 |
153 | /**
154 | * Supports Nukkit 2.X. Doesn't have Block ID limitation but many blocks will be removed or remapped to a
155 | * similar block because it's not implemented by NukkitX yet.
156 | *
157 | * Nukkit 1.X and PowerNukkit 1.X won't load from this save format.
158 | *
159 | * PowerNukkit 2.X accepts this format normally.
160 | */
161 | //TODO #86 NUKKIT_V2,
162 |
163 | /**
164 | * Supports PowerNukkit 2.x. Doesn't have the Block ID limitation and almost all blocks will match the original world.
165 | *
166 | * Nukkit 1.X and PowerNukkit 1.X won't load from this save format.
167 | *
168 | * Nukkit 2.X accepts this format but unsupported blocks might be interpreted as custom or removed, the exact behaviour is unknown.
169 | */
170 | //TODO #86 POWER_NUKKIT_V2
171 | ;
172 | internal val bedrock2target by lazy { properties(conversionMappings) }
173 | internal val blockIds by lazy { propertiesStringInt(blockIdsFile) }
174 | internal val itemIds by lazy { propertiesStringInt(itemIdsFile) }
175 |
176 | internal val blockNames by lazy {
177 | blockIds.entries.asSequence()
178 | .map { (k, v) -> k to v }.groupBy { (_, v) -> v }
179 | .mapValues { it.value.map { p -> p.first } }
180 | }
181 |
182 | internal val itemNames by lazy {
183 | itemIds.entries.asSequence()
184 | .map { (k, v) -> k to v }.groupBy { (_, v) -> v }
185 | .mapValues { it.value.map { p -> p.first } }
186 | .let {
187 | mapOf(0 to "air") + it
188 | }
189 | }
190 |
191 | internal val javaTags2Target by lazy {
192 | javaTags.mapValues { entry ->
193 | entry.value.asSequence().flatMap { javaBlock ->
194 | val (bedrockId, bedrockData) = java2bedrockStates[javaBlock]?.split(',', limit = 2) ?: listOf("0","0").also {
195 | //println("The tag ${entry.key} points to a missing block $javaBlock")
196 | }
197 | val (nukkitId, _) = (
198 | bedrock2target.getProperty("B,$bedrockId,$bedrockData") ?: "$bedrockId,$bedrockData"
199 | ).split(',', limit = 2)
200 | if (nukkitId != "0") {
201 | blockNames[nukkitId.toInt()]?.asSequence() ?: sequenceOf(nukkitId, javaBlock)
202 | } else {
203 | sequenceOf(null)
204 | }
205 | }.filterNotNull().toList()
206 | }
207 | }
208 |
209 | internal val javaBlockProps2Target by lazy {
210 | javaTags2Target + java2bedrockStates.asSequence().filter { ';' !in it.key }.flatMap { (javaBlock, mapping) ->
211 | val (bedrockId, bedrockData) = mapping.split(',', limit = 2)
212 | val (nukkitId, _) = (
213 | bedrock2target.getProperty("B,$bedrockId,$bedrockData") ?: "$bedrockId,$bedrockData"
214 | ).split(',', limit = 2)
215 | if (nukkitId != "0") {
216 | sequenceOf(javaBlock to (blockNames[nukkitId.toInt()] ?: listOf(nukkitId, javaBlock)))
217 | } else {
218 | sequenceOf(null)
219 | }
220 | }.filterNotNull()
221 | }
222 | }
223 | }
224 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/WorldConverterCLI.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc
2 |
3 | import br.com.gamemods.j2nwc.internal.JavaChunk
4 | import br.com.gamemods.j2nwc.internal.checkIds
5 | import kotlinx.cli.*
6 | import java.nio.file.Files
7 | import java.nio.file.Paths
8 | import kotlin.system.exitProcess
9 |
10 | /**
11 | * A JAR entry point to the Command Line Interface functionality of Java to Nukkit World Converter.
12 | */
13 | object WorldConverterCLI {
14 |
15 | /**
16 | * Executes the tool as CLI.
17 | */
18 | @JvmStatic
19 | fun main(args: Array) {
20 | val jarFileName = JavaChunk::class.java.protectionDomain.codeSource.location.toURI().path.substringAfterLast('/')
21 |
22 | val cli = CommandLineInterface("java -jar $jarFileName")
23 | val from by cli.positionalArgument("from-dir", "The world Java Edition world directory")
24 | val to by cli.positionalArgument("to-dir", "The location where the Nukkit world will be created")
25 | val regionsArg by cli.flagValueArgument(
26 | "-r",
27 | "regions",
28 | "A list of region positions that will be converted. Example: -r 0,0;-1,0;-1,-1"
29 | )
30 | val keepCustomHeads by cli.flagArgument(
31 | "--keep-custom-heads",
32 | "Makes the tool convert player heads with custom skins as regular player heads. The default behaviour is to remove them."
33 | )
34 | val target by cli.flagValueArgument(
35 | "--target",
36 | "nukkit-implementation",
37 | "The target output format. Valid values are nukkit (for Nukkit v1.X), nukkit2 (for Nukkit v2.X), " +
38 | "powernukkit (for PowerNukkit v1.X) and powernukkit2 (for PowerNukkit v2.X)",
39 | "nukkit",
40 | { it.trim().toLowerCase() }
41 | )
42 |
43 | try {
44 | cli.parse(args)
45 | } catch (e: Exception) {
46 | exitProcess(1)
47 | }
48 |
49 | if (from == null) {
50 | System.err.println("The from-dir argument was not specified")
51 | cli.printHelp()
52 | exitProcess(2)
53 | }
54 |
55 | if (to == null) {
56 | System.err.println("The to-dir argument was not specified")
57 | cli.printHelp()
58 | exitProcess(3)
59 | }
60 |
61 | val targetType = when (target) {
62 | "nukkit" -> WorldConverter.TargetType.NUKKIT
63 | "powernukkit" -> WorldConverter.TargetType.POWER_NUKKIT
64 | "nukkit2", "powernukkit2" -> {
65 | System.err.println("Direct world conversion to LevelDB isn't supported yet, sorry. " +
66 | "Try ${target.substring(0, target.length - 1)}, the server should update to the 2.0 automatically.")
67 | exitProcess(7)
68 | }
69 | else -> {
70 | System.err.println("Unknown target type $target, valid targets are nukkit, nukkit2, powernukkit, powernukkit2")
71 | cli.printHelp()
72 | exitProcess(8)
73 | }
74 | }
75 |
76 | checkIds(targetType)
77 |
78 | val regionLimit = if (regionsArg == null) {
79 | emptyList()
80 | } else {
81 | val regions = regionsArg!!
82 | if (!regions.matches(Regex("""^(-?\d+,-?\d+)(;-?\d+,-?\d+)*$"""))) {
83 | System.err.println("The regions parameter must follow this syntax:\n-r 0,0;-1,0;-1,-1")
84 | cli.printHelp()
85 | exitProcess(6)
86 | } else {
87 | regions.split(';').asSequence()
88 | .map { it.split(',') }
89 | .map { RegionPosition(it[0].toInt(), it[1].toInt()) }
90 | .toList()
91 | }
92 | }
93 |
94 | val fromPath = Paths.get(from!!)
95 | if (!Files.isDirectory(fromPath)) {
96 | System.err.println("$from is not a folder!")
97 | cli.printHelp()
98 | exitProcess(4)
99 | }
100 |
101 | val toPath = Paths.get(to!!)
102 | try {
103 | WorldConverter(fromPath.toFile(), toPath.toFile()).apply {
104 | regions = regionLimit.toMutableSet()
105 | skipSkinHeads = !keepCustomHeads
106 | this.targetType = targetType
107 | convert()
108 | }
109 | println("The world has been converted successfully")
110 | } catch (e: Exception) {
111 | System.err.println("An error has occurred while converting the world!")
112 | e.printStackTrace(System.err)
113 | println("The world conversion has failed")
114 | exitProcess(5)
115 | }
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/internal/JavaChunk.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc.internal
2 |
3 | import br.com.gamemods.nbtmanipulator.NbtByteArray
4 | import br.com.gamemods.nbtmanipulator.NbtCompound
5 | import br.com.gamemods.nbtmanipulator.NbtIntArray
6 | import br.com.gamemods.nbtmanipulator.NbtList
7 | import br.com.gamemods.regionmanipulator.Chunk
8 | import br.com.gamemods.regionmanipulator.ChunkPos
9 | import java.util.*
10 |
11 | internal data class JavaPalette(
12 | var blockName: String,
13 | var properties: NbtCompound?
14 | ) {
15 | constructor(compound: NbtCompound): this (
16 | compound.getString("Name"),
17 | compound.getNullableCompound("Properties")
18 | )
19 | }
20 |
21 | internal data class JavaChunkSection(
22 | var chunkPos: ChunkPos,
23 | var yPos: Int,
24 | var blockStates: LongArray?,
25 | var palette: List?,
26 | var skyLight: ByteArray?
27 | ) {
28 | constructor(compound: NbtCompound, chunkPos: ChunkPos): this (
29 | chunkPos,
30 | compound.getByte("Y").toInt(),
31 | compound.getNullableLongArray("BlockStates"),
32 | compound.getNullableCompoundList("Palette")?.map { JavaPalette(it) },
33 | compound.getNullableByteArray("SkyLight")
34 | )
35 |
36 | override fun equals(other: Any?): Boolean {
37 | if (this === other) return true
38 | if (javaClass != other?.javaClass) return false
39 |
40 | other as JavaChunkSection
41 |
42 | if (yPos != other.yPos) return false
43 | if (blockStates != null) {
44 | if (other.blockStates == null) return false
45 | if (!blockStates!!.contentEquals(other.blockStates!!)) return false
46 | } else if (other.blockStates != null) return false
47 | if (palette != other.palette) return false
48 | if (skyLight != null) {
49 | if (other.skyLight == null) return false
50 | if (!skyLight!!.contentEquals(other.skyLight!!)) return false
51 | } else if (other.skyLight != null) return false
52 |
53 | return true
54 | }
55 |
56 | override fun hashCode(): Int {
57 | var result = yPos
58 | result = 31 * result + (blockStates?.contentHashCode() ?: 0)
59 | result = 31 * result + palette.hashCode()
60 | result = 31 * result + (skyLight?.contentHashCode() ?: 0)
61 | return result
62 | }
63 | }
64 |
65 | internal data class JavaBiomeArea(
66 | val biome: Int,
67 | val x: Int,
68 | val y: Int,
69 | val z: Int,
70 | val lastX: Int,
71 | val lastY: Int,
72 | val lastZ: Int
73 | )
74 |
75 | internal data class JavaChunk(
76 | var lastModified: Date,
77 | var heightMap: NbtCompound?,
78 | var structures: NbtCompound,
79 | var entities: NbtList,
80 | var liquidsToBeTicked: NbtList>?,
81 | var liquidTicks: NbtList<*>?,
82 | var postProcessing: NbtList>?,
83 | var sections: Map,
84 | var tileEntities: NbtList,
85 | var tileTicks: NbtList<*>?,
86 | var toBeTicked: NbtList>?,
87 | var inhabitedTime: Long,
88 | var isLightOn: Boolean,
89 | var lastUpdate: Date,
90 | var status: String,
91 | var position: ChunkPos,
92 | var biomes: List?
93 | ) {
94 | constructor(chunk: Chunk): this(
95 | chunk.lastModified,
96 | chunk.level.getNullableCompound("Heightmaps"),
97 | chunk.level.getCompound("Structures"),
98 | chunk.level.getNullableCompoundList("Entities") ?: NbtList(),
99 | chunk.level.getNullableListOfList("LiquidsToBeTicked"),
100 | chunk.level.getNullableList("LiquidTicks"),
101 | chunk.level.getNullableListOfList("PostProcessing"),
102 | (chunk.level.getNullableCompoundList("Sections") ?: NbtList()).associate {
103 | it.getByte("Y").toInt() to JavaChunkSection(
104 | it,
105 | ChunkPos(chunk.level.getInt("xPos"), chunk.level.getInt("zPos"))
106 | )
107 | },
108 | chunk.level.getNullableCompoundList("TileEntities") ?: NbtList(),
109 | chunk.level.getNullableList("TileTicks"),
110 | chunk.level.getNullableListOfList("ToBeTicked"),
111 | chunk.level.getNullableLong("InhabitedTime") ?: 0,
112 | chunk.level.getNullableBooleanByte("isLightOn"),
113 | Date(chunk.level.getLong("LastUpdate") * 1000L),
114 | chunk.level.getString("Status"),
115 | ChunkPos(chunk.level.getInt("xPos"), chunk.level.getInt("zPos")),
116 | chunk.level["Biomes"].let { tag ->
117 | when (tag) {
118 | null -> null
119 | is NbtIntArray -> {
120 | if (tag.value.size == 256) {
121 | tag.value.mapIndexed { index, biome ->
122 | val z = index and 0xF
123 | val x = (index shr 4) and 0xF
124 | JavaBiomeArea(biome and 0xFF, x, 0,z, x, 256, z)
125 | }
126 | } else {
127 | val biomes = tag.value.asSequence().chunked(64).chunked(4).toList()
128 | val areas = mutableListOf()
129 | biomes.forEachIndexed { x, xBiomes ->
130 | xBiomes.forEachIndexed { z, zBiomes ->
131 | zBiomes.forEachIndexed { y, biome ->
132 | areas += JavaBiomeArea(biome,
133 | x * 4, y * 4, z * 4,
134 | ((x+1) * 4) -1,
135 | ((y+1) * 4) -1,
136 | ((z+1) * 4) -1
137 | )
138 | }
139 | }
140 | }
141 | areas
142 | }
143 | }
144 | is NbtByteArray -> {
145 | tag.value.mapIndexed { index, biome ->
146 | val z = index and 0xF
147 | val x = (index shr 4) and 0xF
148 | JavaBiomeArea(biome.toInt() and 0xFF, x, 0,z, x, 256, z)
149 | }
150 | }
151 | else -> error("Unexpected type for Biomes tag: ${tag::class.java}")
152 | }
153 | }
154 | )
155 |
156 | override fun equals(other: Any?): Boolean {
157 | if (this === other) return true
158 | if (javaClass != other?.javaClass) return false
159 |
160 | other as JavaChunk
161 |
162 | if (lastModified != other.lastModified) return false
163 | if (heightMap != other.heightMap) return false
164 | if (structures != other.structures) return false
165 | if (entities != other.entities) return false
166 | if (liquidsToBeTicked != other.liquidsToBeTicked) return false
167 | if (liquidTicks != other.liquidTicks) return false
168 | if (postProcessing != other.postProcessing) return false
169 | if (sections != other.sections) return false
170 | if (tileEntities != other.tileEntities) return false
171 | if (tileTicks != other.tileTicks) return false
172 | if (toBeTicked != other.toBeTicked) return false
173 | if (inhabitedTime != other.inhabitedTime) return false
174 | if (isLightOn != other.isLightOn) return false
175 | if (lastUpdate != other.lastUpdate) return false
176 | if (status != other.status) return false
177 | if (position != other.position) return false
178 | if (biomes != other.biomes) return false
179 |
180 | return true
181 | }
182 |
183 | override fun hashCode(): Int {
184 | var result = lastModified.hashCode()
185 | result = 31 * result + heightMap.hashCode()
186 | result = 31 * result + structures.hashCode()
187 | result = 31 * result + entities.hashCode()
188 | result = 31 * result + liquidsToBeTicked.hashCode()
189 | result = 31 * result + liquidTicks.hashCode()
190 | result = 31 * result + postProcessing.hashCode()
191 | result = 31 * result + sections.hashCode()
192 | result = 31 * result + tileEntities.hashCode()
193 | result = 31 * result + tileTicks.hashCode()
194 | result = 31 * result + toBeTicked.hashCode()
195 | result = 31 * result + inhabitedTime.hashCode()
196 | result = 31 * result + isLightOn.hashCode()
197 | result = 31 * result + lastUpdate.hashCode()
198 | result = 31 * result + status.hashCode()
199 | result = 31 * result + position.hashCode()
200 | result = 31 * result + biomes.hashCode()
201 | return result
202 | }
203 | }
204 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/internal/LevelFileConverter.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc.internal
2 |
3 | import br.com.gamemods.j2nwc.WorldConverter
4 | import br.com.gamemods.nbtmanipulator.*
5 | import java.io.File
6 |
7 | internal fun convertLevelFile(from: File, to: File, worldConverter: WorldConverter) {
8 | val input = NbtIO.readNbtFile(from)
9 | val inputData = input.compound.getCompound("Data")
10 |
11 | val outputData = NbtCompound()
12 | outputData.copyFrom(inputData, "GameRules")
13 | outputData.copyFrom(inputData, "DayTime")
14 | outputData.copyFrom(inputData, "GameType")
15 | val generatorName = inputData.getNullableString("generatorName") ?: "normal"
16 | outputData["generatorName"] = generatorName
17 | outputData["generatorVersion"] = 1
18 | inputData.getNullableCompound("generatorOptions")?.convertGeneratorOptions(generatorName, worldConverter)?.also {
19 | outputData["generatorOptions"] = it
20 | }
21 | outputData["hardcore"] = false
22 | outputData["initialized"] = false
23 | outputData.copyFrom(inputData, "LastPlayed")
24 | outputData.copyFrom(inputData, "LevelName")
25 | outputData.copyFrom(inputData, "raining")
26 | outputData.copyFrom(inputData, "rainTime")
27 | outputData.copyFrom(inputData, "RandomSeed")
28 | outputData.copyFrom(inputData, "SizeOnDisk")
29 | outputData.copyFrom(inputData, "SpawnX")
30 | outputData.copyFrom(inputData, "SpawnY")
31 | outputData.copyFrom(inputData, "SpawnZ")
32 | outputData.copyFrom(inputData, "thundering")
33 | outputData.copyFrom(inputData, "thunderTime")
34 | outputData.copyFrom(inputData, "Time")
35 | outputData.copyFrom(inputData, "version")
36 |
37 | val output = NbtCompound("Data" to outputData)
38 | val file = NbtFile("", output)
39 | NbtIO.writeNbtFile(to, file)
40 | }
41 |
42 | private fun NbtCompound.convertGeneratorOptions(
43 | generatorName: String,
44 | worldConverter: WorldConverter
45 | ): String? {
46 | // Nukkit only supports presets (aka generatorOptions) in flat worlds. It also have a limited support to generators.
47 | if (generatorName != "flat") {
48 | return null
49 | }
50 |
51 | val preset = StringBuilder("2;")
52 | val layers = getNullableCompoundList("layers") ?: return null
53 | layers.forEach { layer ->
54 | val blockName = layer.getNullableString("block") ?: return@forEach
55 | val heightNbt = layer["height"]
56 | val height = when (heightNbt) {
57 | is NbtInt -> heightNbt.value
58 | is NbtByte -> heightNbt.value.toInt()
59 | else -> 1
60 | }
61 | val javaBlock = JavaBlock(BlockPos(0, height, 0), JavaPalette(blockName, null), null)
62 | val nukkitBlock = javaBlock.toNukkit(mutableListOf(), mutableListOf(), worldConverter)
63 | for (i in 1..height) {
64 | preset.append(nukkitBlock.blockData.blockId)
65 | if (nukkitBlock.blockData.data != 0) {
66 | preset.append(':').append(nukkitBlock.blockData.data)
67 | }
68 | preset.append(',')
69 | }
70 | }
71 | if (preset.endsWith(',')) {
72 | preset.setLength(preset.length - 1)
73 | }
74 | preset.append(';')
75 | val biomeName = getNullableString("biome")?.removePrefix("minecraft:")
76 | val nukkitBiome = if (biomeName != null) {
77 | val remap = javaBiomesString2Bedrock[biomeName]
78 | if (remap == null) {
79 | System.err.println("Unmapped biome with name $biomeName")
80 | }
81 | remap ?: 1
82 | } else {
83 | 1
84 | }
85 | preset.append(nukkitBiome)
86 |
87 | //structures are not supported by Nukkit's flat worlds
88 | return preset.toString()
89 | }
90 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/internal/NukkitChunk.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc.internal
2 |
3 | import br.com.gamemods.j2nwc.WorldConverter
4 | import br.com.gamemods.nbtmanipulator.*
5 | import br.com.gamemods.regionmanipulator.ChunkPos
6 |
7 | internal data class NukkitChunkSection(
8 | var yPos: Int,
9 | var blockLight: ByteArray,
10 | var blocks: ByteArray,
11 | var blocksData: ByteArray,
12 | var skyLight: ByteArray,
13 | var targetType: WorldConverter.TargetType,
14 | var version: Int = 0,
15 | var blocksExtra: ByteArray? = null,
16 | var blocksDataExtra: ByteArray? = null,
17 | var waterlogged: BooleanArray? = null
18 | ) {
19 | fun toNbt(): NbtCompound {
20 | val nbt = NbtCompound(
21 | "Y" to NbtByte(yPos.toByte()),
22 | "BlockLight" to NbtByteArray(blockLight),
23 | "SkyLight" to NbtByteArray(skyLight)
24 | )
25 |
26 | if (version == 0 || version == 1) {
27 | nbt["Blocks"] = blocks
28 | nbt["Data"] = blocksData
29 | if (version == 1 && targetType == WorldConverter.TargetType.POWER_NUKKIT) {
30 | blocksExtra?.let { nbt["BlocksExtra"] = it }
31 | blocksDataExtra?.let { nbt["DataExtra"] = it }
32 | }
33 | } else if (version == 7 && targetType == WorldConverter.TargetType.POWER_NUKKIT) {
34 | val layer0 = NbtCompound(
35 | "Blocks" to NbtByteArray(blocks),
36 | "Data" to NbtByteArray(blocksData)
37 | )
38 | blocksExtra?.let { layer0["BlocksExtra"] = it }
39 | blocksDataExtra?.let { layer0["DataExtra"] = it }
40 | val storage = NbtList(layer0)
41 | waterlogged?.let { waterlogged ->
42 | val layer1 = NbtCompound(
43 | "Blocks" to NbtByteArray(ByteArray(waterlogged.size) { if(waterlogged[it]) 8 else 0 })
44 | )
45 | storage += layer1
46 | }
47 | nbt["Storage"] = storage
48 | } else {
49 | error("Unexpected chunk section version $version with target type $targetType")
50 | }
51 |
52 | if (version != 0) {
53 | nbt["Version"] = version
54 | }
55 |
56 | return nbt
57 | }
58 |
59 | @Suppress("DuplicatedCode")
60 | override fun equals(other: Any?): Boolean {
61 | if (this === other) return true
62 | if (javaClass != other?.javaClass) return false
63 |
64 | other as NukkitChunkSection
65 |
66 | if (yPos != other.yPos) return false
67 | if (!blockLight.contentEquals(other.blockLight)) return false
68 | if (!blocks.contentEquals(other.blocks)) return false
69 | if (!blocksData.contentEquals(other.blocksData)) return false
70 | if (!skyLight.contentEquals(other.skyLight)) return false
71 | if (targetType != other.targetType) return false
72 | if (version != other.version) return false
73 | val blocksExtra1 = blocksExtra
74 | val blocksExtra2 = other.blocksExtra
75 | if (blocksExtra1 != null) {
76 | if (blocksExtra2 == null) return false
77 | if (!blocksExtra1.contentEquals(blocksExtra2)) return false
78 | } else if (blocksExtra2 != null) return false
79 | val blocksDataExtra1 = blocksDataExtra
80 | val blocksDataExtra2 = other.blocksDataExtra
81 | if (blocksDataExtra1 != null) {
82 | if (blocksDataExtra2 == null) return false
83 | if (!blocksDataExtra1.contentEquals(blocksDataExtra2)) return false
84 | } else if (blocksDataExtra2 != null) return false
85 | val waterlogged1 = waterlogged
86 | val waterlogged2 = other.waterlogged
87 | if (waterlogged1 != null) {
88 | if (waterlogged2 == null) return false
89 | if (!waterlogged1.contentEquals(waterlogged2)) return false
90 | } else if (waterlogged2 != null) return false
91 |
92 | return true
93 | }
94 |
95 | override fun hashCode(): Int {
96 | var result = yPos
97 | result = 31 * result + blockLight.contentHashCode()
98 | result = 31 * result + blocks.contentHashCode()
99 | result = 31 * result + blocksData.contentHashCode()
100 | result = 31 * result + skyLight.contentHashCode()
101 | result = 31 * result + targetType.hashCode()
102 | result = 31 * result + version
103 | result = 31 * result + (blocksExtra?.contentHashCode() ?: 0)
104 | result = 31 * result + (blocksDataExtra?.contentHashCode() ?: 0)
105 | result = 31 * result + (waterlogged?.contentHashCode() ?: 0)
106 | return result
107 | }
108 |
109 |
110 | }
111 |
112 | internal data class NukkitChunk(
113 | var entities: NbtList,
114 | var sections: Map,
115 | var tileEntities: NbtList,
116 | var inhabitedTime: Long,
117 | var lightPopulated: Boolean,
118 | var terrainGenerated: Boolean,
119 | var terrainPopulated: Boolean,
120 | var v: Byte,
121 | var position: ChunkPos,
122 | var biomes: ByteArray,
123 | var extraData: ByteArray,
124 | var heightMap: IntArray
125 | ) {
126 | fun toNbt(): NbtFile {
127 | val level = NbtCompound()
128 | level["Entities"] = entities
129 | level["Sections"] = NbtList(sections.values.map { it.toNbt() })
130 | level["TileEntities"] = tileEntities
131 | level["InhabitedTime"] = inhabitedTime
132 | level["LightPopulated"] = lightPopulated
133 | level["TerrainPopulated"] = terrainPopulated
134 | level["V"] = v
135 | level["xPos"] = position.xPos
136 | level["zPos"] = position.zPos
137 | level["Biomes"] = biomes
138 | level["ExtraData"] = extraData
139 | level["HeightMap"] = heightMap
140 |
141 | return NbtFile("", NbtCompound("Level" to level))
142 | }
143 |
144 | override fun equals(other: Any?): Boolean {
145 | if (this === other) return true
146 | if (javaClass != other?.javaClass) return false
147 |
148 | other as NukkitChunk
149 |
150 | if (entities != other.entities) return false
151 | if (sections != other.sections) return false
152 | if (tileEntities != other.tileEntities) return false
153 | if (inhabitedTime != other.inhabitedTime) return false
154 | if (lightPopulated != other.lightPopulated) return false
155 | if (terrainGenerated != other.terrainGenerated) return false
156 | if (terrainPopulated != other.terrainPopulated) return false
157 | if (v != other.v) return false
158 | if (position != other.position) return false
159 | if (!biomes.contentEquals(other.biomes)) return false
160 | if (!extraData.contentEquals(other.extraData)) return false
161 | if (!heightMap.contentEquals(other.heightMap)) return false
162 |
163 | return true
164 | }
165 |
166 | override fun hashCode(): Int {
167 | var result = entities.hashCode()
168 | result = 31 * result + sections.hashCode()
169 | result = 31 * result + tileEntities.hashCode()
170 | result = 31 * result + inhabitedTime.hashCode()
171 | result = 31 * result + lightPopulated.hashCode()
172 | result = 31 * result + terrainGenerated.hashCode()
173 | result = 31 * result + terrainPopulated.hashCode()
174 | result = 31 * result + v
175 | result = 31 * result + position.hashCode()
176 | result = 31 * result + biomes.contentHashCode()
177 | result = 31 * result + extraData.contentHashCode()
178 | result = 31 * result + heightMap.contentHashCode()
179 | return result
180 | }
181 | }
182 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/internal/RegionFileConverter.kt:
--------------------------------------------------------------------------------
1 | @file:JvmName("RegionFileConverter")
2 | package br.com.gamemods.j2nwc.internal
3 |
4 | import br.com.gamemods.j2nwc.WorldConverter
5 | import br.com.gamemods.regionmanipulator.Chunk
6 | import br.com.gamemods.regionmanipulator.Region
7 | import br.com.gamemods.regionmanipulator.RegionIO
8 | import java.io.File
9 |
10 | internal typealias PostWorldConversionHook = (from: File, to: File) -> Unit
11 |
12 | internal fun convertRegionFile(
13 | from: File,
14 | to: File,
15 | worldHooks: MutableList,
16 | worldConverter: WorldConverter
17 | ) {
18 | val javaRegion = RegionIO.readRegion(from)
19 | val nukkitRegion = javaRegion.toNukkit(worldHooks, worldConverter)
20 | RegionIO.writeRegion(to, nukkitRegion)
21 | }
22 |
23 | internal inline fun modifyRegion(worldDir: File, xPos: Int, zPos: Int, modify: (Region) -> Unit) {
24 | val regionFile = File(worldDir, "region/r.$xPos.$zPos.mca")
25 | RegionIO.readRegion(regionFile).let {
26 | modify(it)
27 | RegionIO.writeRegion(regionFile, it)
28 | }
29 | }
30 |
31 | internal typealias PostConversionHook = (javaRegion: Region, nukkitRegion: Region) -> Unit
32 |
33 | internal fun Region.toNukkit(
34 | worldHooks: MutableList,
35 | worldConverter: WorldConverter
36 | ): Region {
37 | val postConversionHooks = mutableListOf()
38 | val nukkitRegion = Region(position, values.mapNotNull {
39 | it.toNukkit(postConversionHooks, worldHooks, worldConverter)?.let { nukkitChunk ->
40 | Chunk(it.lastModified, nukkitChunk.toNbt())
41 | }
42 | })
43 | postConversionHooks.forEach {
44 | it(this, nukkitRegion)
45 | }
46 | return nukkitRegion
47 | }
48 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/internal/chunk-converter.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc.internal
2 |
3 | import br.com.gamemods.j2nwc.WorldConverter
4 | import br.com.gamemods.nbtmanipulator.NbtCompound
5 | import br.com.gamemods.nbtmanipulator.NbtList
6 | import br.com.gamemods.regionmanipulator.Chunk
7 |
8 | internal fun Chunk.toNukkit(
9 | regionPostConversionHooks: MutableList,
10 | worldHooks: MutableList,
11 | worldConverter: WorldConverter
12 | ): NukkitChunk? {
13 | val javaChunk = JavaChunk(this)
14 | if (javaChunk.sections.isEmpty()) {
15 | if (javaChunk.status == "structure_starts") {
16 | return null
17 | } /*else {
18 | println("Empty Chunk: ${javaChunk.position} ${javaChunk.status}")
19 | }*/
20 | } /*else if (javaChunk.status != "full") {
21 | println("Chunk status: ${javaChunk.status}")
22 | }*/
23 | val javaTileEntities = javaChunk.tileEntities.associate {
24 | BlockPos(it.getInt("x"), it.getInt("y"), it.getInt("z")) to it
25 | }
26 | val nukkitTileEntities = mutableMapOf()
27 | val nukkitSections = javaChunk.sections.entries.asSequence()
28 | .filter { it.value.yPos >= 0 }
29 | .mapNotNull {
30 | it.key to (
31 | it.value.toNukkit(javaTileEntities, nukkitTileEntities, regionPostConversionHooks, worldHooks, worldConverter)
32 | ?: return@mapNotNull null
33 | )
34 | }
35 | .toMap()
36 | val nukkitChunk = NukkitChunk(
37 | NbtList(javaChunk.entities.mapNotNull {
38 | toNukkitEntity(
39 | it,
40 | javaChunk,
41 | nukkitSections,
42 | nukkitTileEntities,
43 | regionPostConversionHooks,
44 | worldHooks,
45 | worldConverter
46 | )
47 | }),
48 | nukkitSections,
49 | NbtList(nukkitTileEntities.values.toMutableList()),
50 | javaChunk.inhabitedTime,
51 | false,
52 | javaChunk.status != "empty",
53 | javaChunk.status != "empty",
54 | 1,
55 | javaChunk.position,
56 | javaChunk.toNukkitBiomes(),
57 | byteArrayOf(0, 0, 0, 0),
58 | IntArray(256) { 255 }
59 | )
60 | return nukkitChunk
61 | }
62 |
63 | internal data class BlockPos(val xPos: Int, val yPos: Int, val zPos: Int)
64 | internal data class JavaBlock(val blockPos: BlockPos, val type: JavaPalette, var tileEntity: NbtCompound?)
65 | internal data class NukkitBlock(val blockPos: BlockPos, var blockData: BlockData, var tileEntity: NbtCompound?, var waterlogged: Boolean)
66 | internal fun JavaChunkSection.toNukkit(
67 | javaTileEntities: Map,
68 | nukkitTileEntities: MutableMap,
69 | regionPostConversionHooks: MutableList,
70 | worldHooks: MutableList,
71 | worldConverter: WorldConverter
72 | ): NukkitChunkSection? {
73 | val blockStates = blockStates ?: return NukkitChunkSection(
74 | targetType = worldConverter.targetType,
75 | yPos = yPos,
76 | blockLight = ByteArray(2048),
77 | blocks = ByteArray(4096),
78 | blocksData = ByteArray(2048),
79 | skyLight = skyLight ?: ByteArray(2048)
80 | )
81 |
82 | val palette = palette ?: emptyList()
83 |
84 | val bitPerIndex = blockStates.size * 64 / 4096
85 | val maxValue = (1L shl bitPerIndex) - 1L
86 |
87 | fun get(pos: Int): Int {
88 | val a = pos * bitPerIndex
89 | val b = a shr 6
90 | val c = (pos + 1) * bitPerIndex - 1 shr 6
91 | val d = a xor (b shl 6)
92 | return if (b == c) {
93 | (blockStates[b].ushr(d) and maxValue).toInt()
94 | } else {
95 | val e = 64 - d
96 | (blockStates[b].ushr(d) or (blockStates[c] shl e) and maxValue).toInt()
97 | }
98 | }
99 |
100 | val paletteIndexes = IntArray(4096) { i ->
101 | get(i).also {
102 | check(it >= 0 && it < palette.size) {
103 | "Failed to get the Palette ID"
104 | }
105 | }
106 | }
107 |
108 | val blockPalettes = Array(4096) {
109 | val y = (it shr 8) and 0xF
110 | val z = (it shr 4) and 0xF
111 | val x = it and 0xF
112 | val blockPos =
113 | BlockPos(x + chunkPos.xPos * 16, y + yPos * 16, z + chunkPos.zPos * 16)
114 | JavaBlock(blockPos, palette[paletteIndexes[it]], javaTileEntities[blockPos])
115 | }
116 |
117 | var waterlogged: BooleanArray? = null
118 | val nukkitBlocks = blockPalettes.mapIndexed { i, java -> java.toNukkit(regionPostConversionHooks, worldHooks, worldConverter).also { block ->
119 | if (block.waterlogged) {
120 | var waterloggedBlocks = waterlogged
121 | if (waterloggedBlocks == null) {
122 | waterloggedBlocks = BooleanArray(blockPalettes.size)
123 | waterlogged = waterloggedBlocks
124 | }
125 | waterloggedBlocks[i] = true
126 | }
127 | block.tileEntity?.let { nukkitTileEntity ->
128 | nukkitTileEntities[block.blockPos] = nukkitTileEntity
129 | }
130 | } }
131 |
132 | val highBlockId = nukkitBlocks.parallelStream().anyMatch { it.blockData.blockId > 255 }
133 | val highBlockData = nukkitBlocks.parallelStream().anyMatch { it.blockData.data > 15 }
134 |
135 | fun assemblyDataArray(firstPart: Boolean): ByteArray {
136 | return ByteArray(2048) {
137 | val double = it * 2
138 | val stored: Pair
139 | if (firstPart) {
140 | stored = nukkitBlocks[double].blockData.dataFirstPart to nukkitBlocks[double + 1].blockData.dataFirstPart
141 | } else {
142 | stored = nukkitBlocks[double].blockData.dataSecondPart to nukkitBlocks[double + 1].blockData.dataSecondPart
143 | }
144 | val first = stored.first and 0x0F
145 | val second = (stored.second and 0x0F) shl 4
146 | val merged = first or second
147 | (merged and 0xFF).toByte()
148 | }
149 | }
150 |
151 | return NukkitChunkSection(
152 | targetType = worldConverter.targetType,
153 | version = when {
154 | waterlogged != null -> 7
155 | highBlockId || highBlockData -> 1
156 | else -> 0
157 | },
158 | yPos = yPos,
159 | blockLight = ByteArray(2048),
160 | blocks = ByteArray(4096) { nukkitBlocks[it].blockData.byteBlockId },
161 | blocksData = assemblyDataArray(true),
162 | blocksExtra = if (highBlockId) {
163 | ByteArray(4096) { nukkitBlocks[it].blockData.byteBlockIdExtra }
164 | } else {
165 | null
166 | },
167 | blocksDataExtra = if (highBlockData) {
168 | assemblyDataArray(false)
169 | } else {
170 | null
171 | },
172 | waterlogged = waterlogged,
173 | skyLight = skyLight ?: ByteArray(2048)
174 | )
175 | }
176 |
177 | internal fun JavaChunk.toNukkitBiomes(): ByteArray {
178 | val biomes = this.biomes ?: emptyList()
179 | //TODO Get the biome from the highest block in a given XZ coordinate inside the chunk
180 | //val heightMap = heightMap?.getLongArray("WORLD_SURFACE") ?: LongArray(256) { 64 }
181 | val biomes256 = IntArray(256) { index ->
182 | val z = index and 0xF
183 | val x = (index shr 4) and 0xF
184 | val y = 64
185 | val javaBiome = biomes
186 | .firstOrNull { x in it.x..it.lastX && z in it.z..it.lastZ && y in it.y..it.lastY }
187 | ?: biomes.firstOrNull { x in it.x..it.lastX && z in it.z..it.lastZ }
188 |
189 | javaBiome?.biome ?: 1
190 | }
191 |
192 | return biomes256.map { id ->
193 | val remap = javaBiomes2Bedrock[id]
194 | if (remap == null) {
195 | System.err.println("Unmapped biome with id $id")
196 | }
197 | remap ?: 1
198 | }.toByteArray()
199 | }
200 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/internal/entity-converter.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc.internal
2 |
3 | import br.com.gamemods.j2nwc.WorldConverter
4 | import br.com.gamemods.nbtmanipulator.*
5 | import br.com.gamemods.regionmanipulator.ChunkPos
6 | import br.com.gamemods.regionmanipulator.Region
7 | import java.io.FileNotFoundException
8 | import kotlin.math.floor
9 |
10 | internal fun toNukkitEntity(
11 | javaEntity: NbtCompound,
12 | javaChunk: JavaChunk?,
13 | nukkitSections: Map?,
14 | nukkitTileEntities: MutableMap?,
15 | regionPostConversionHooks: MutableList,
16 | worldHooks: MutableList,
17 | worldConverter: WorldConverter
18 | ): NbtCompound? {
19 | fun convertBaseEntity(): NbtCompound? {
20 | return NbtCompound().apply {
21 | val nukkitId = javaEntities2Nukkit[javaEntity.getNullableString("id")?.removePrefix("minecraft:") ?: return null] ?: return null
22 | this["id"] = nukkitId
23 | copyFrom(javaEntity, "CustomName")
24 | copyFrom(javaEntity, "CustomNameVisible")
25 | copyFrom(javaEntity, "Pos")
26 | copyFrom(javaEntity, "Motion")
27 | copyFrom(javaEntity, "Rotation")
28 | copyFrom(javaEntity, "FallDistance")
29 | copyFrom(javaEntity, "Fire")
30 | copyFrom(javaEntity, "Air")
31 | copyFrom(javaEntity, "OnGround")
32 | copyFrom(javaEntity, "Invulnerable")
33 | copyFrom(javaEntity, "Scale")
34 | copyFrom(javaEntity, "Silent")
35 | copyFrom(javaEntity, "NoGravity")
36 | copyFrom(javaEntity, "Glowing")
37 | //TODO Scoreboard Tags
38 | //TODO Passengers
39 | }
40 | }
41 | return when(javaEntity.getString("id").removePrefix("minecraft:")) {
42 | "item" -> {
43 | val nukkitEntity = convertBaseEntity() ?: return null
44 | val nukkitItem = javaEntity.getNullableCompound("Item")?.toNukkitItem(worldConverter)
45 | ?.takeIf { it.getShort("id").toInt() != 0 } ?: return null
46 | nukkitEntity["Item"] = nukkitItem
47 | nukkitEntity.copyFrom(javaEntity, "Health")
48 | nukkitEntity.copyFrom(javaEntity, "Age")
49 | nukkitEntity.copyFrom(javaEntity, "PickupDelay")
50 | // The Owner and Thrower aren't migrated because they players account
51 | // from Java Edition differs from accounts from Bedrock Edition
52 | nukkitEntity
53 | }
54 | "experience_orb" -> {
55 | val nukkitEntity = convertBaseEntity() ?: return null
56 | nukkitEntity.copyFrom(javaEntity, "Health")
57 | nukkitEntity.copyFrom(javaEntity, "Age")
58 | nukkitEntity.copyFrom(javaEntity, "Value")
59 | nukkitEntity
60 | }
61 | "tnt" -> {
62 | val nukkitEntity = convertBaseEntity() ?: return null
63 | val fuse = javaEntity.getNullableShort("Fuse") ?: 0
64 | nukkitEntity["Fuse"] = fuse.coerceIn(Byte.MIN_VALUE.toShort(), Byte.MAX_VALUE.toShort()).toByte()
65 | nukkitEntity
66 | }
67 | "falling_block" -> {
68 | val nukkitEntity = convertBaseEntity() ?: return null
69 | val javaTileEntity = javaEntity.getNullableCompound("TileEntityData")
70 | val javaBlockState = javaEntity.getNullableCompound("BlockState")
71 | ?: NbtCompound("Name" to NbtString("minecraft:sand"))
72 | val javaPalette = JavaPalette(
73 | javaBlockState.getNullableString("Name") ?: "minecraft:sand",
74 | javaBlockState.getNullableCompound("Properties")
75 | )
76 | val javaBlock = JavaBlock(
77 | BlockPos(0, 0, 0),
78 | javaPalette,
79 | javaTileEntity
80 | )
81 | val nukkitBlock = javaBlock.toNukkit(mutableListOf(), mutableListOf(), worldConverter)
82 | if (nukkitBlock.blockData.blockId == 0) {
83 | null
84 | } else {
85 | nukkitEntity["TileID"] = nukkitBlock.blockData.blockId
86 | nukkitEntity["Data"] = nukkitBlock.blockData.data.toByte()
87 | nukkitEntity
88 | }
89 | }
90 | "painting" -> {
91 | val nukkitEntity = convertBaseEntity() ?: return null
92 | val paintingData = paintings[javaEntity.getNullableString("Motive")?.removePrefix("minecraft:") ?: ""] ?: return null
93 | nukkitEntity["Motive"] = paintingData.id
94 | val javaFacing = javaEntity.getNullableByte("Facing")
95 | val (nukkitDirection, xInc, zInc) = when (javaFacing?.toInt()) {
96 | 0 -> arrayOf(3, 0, 1) // south
97 | 1 -> arrayOf(4, -1, 0) // west
98 | 2 -> arrayOf(2, 0, -1) // north
99 | 3 -> arrayOf(5, 1, 0) // east
100 | else -> arrayOf(2, 0, -1) // north
101 | }
102 |
103 | val javaTileX = javaEntity.getInt("TileX")
104 | val tileY = javaEntity.getInt("TileY")
105 | val javaTileZ = javaEntity.getInt("TileZ")
106 |
107 | val nukkitTileX = javaTileX + xInc*-1
108 | val nukkitTileZ = javaTileZ + zInc*-1
109 | nukkitEntity["Pos"] = NbtList(
110 | NbtDouble(nukkitTileX.toDouble()),
111 | NbtDouble(tileY.toDouble()),
112 | NbtDouble(nukkitTileZ.toDouble())
113 | )
114 | nukkitEntity["TileX"] = nukkitTileX
115 | nukkitEntity["TileY"] = tileY
116 | nukkitEntity["TileZ"] = nukkitTileZ
117 | nukkitEntity["Direction"] = nukkitDirection.toByte()
118 | nukkitEntity["Rotation"] = NbtList(NbtFloat(nukkitDirection * 90F), NbtFloat(0F))
119 |
120 | val nukkitChunkPos = ChunkPos(floor(nukkitTileX / 16.0).toInt(), floor(nukkitTileZ / 16.0).toInt())
121 | val javaChunkPos = ChunkPos(floor(javaTileX / 16.0).toInt(), floor(javaTileZ / 16.0).toInt())
122 | if (requireNotNull(javaChunk).position == nukkitChunkPos) {
123 | nukkitEntity
124 | } else {
125 | val nukkitRegX = floor(nukkitChunkPos.xPos / 32.0).toInt()
126 | val nukkitRegZ = floor(nukkitChunkPos.zPos / 32.0).toInt()
127 | val javaRegX = floor(javaChunkPos.xPos / 32.0).toInt()
128 | val javaRegZ = floor(javaChunkPos.zPos / 32.0).toInt()
129 | fun addEntity(nukkitRegion: Region) {
130 | nukkitRegion[nukkitChunkPos]?.level?.getCompoundList("Entities")?.add(nukkitEntity)
131 | }
132 | if (nukkitRegX == javaRegX && nukkitRegZ == javaRegZ) {
133 | regionPostConversionHooks += { _, nukkitRegion ->
134 | addEntity(nukkitRegion)
135 | }
136 | } else {
137 | worldHooks += { _, worldDir ->
138 | try {
139 | modifyRegion(worldDir, nukkitRegX, nukkitRegZ, ::addEntity)
140 | } catch (e: FileNotFoundException) {
141 | System.err.println("Unable to migrate the painting at $javaTileX,$tileY,$javaTileZ because " +
142 | "the region file r.$nukkitRegX,$nukkitRegZ.mca does not exists")
143 | }
144 | }
145 | }
146 | null
147 | }
148 | }
149 | "item_frame" -> {
150 | val tileX = javaEntity.getInt("TileX")
151 | val tileY = javaEntity.getInt("TileY")
152 | val tileZ = javaEntity.getInt("TileZ")
153 | val chunkSectionY = tileY / 16
154 | val chunkSection = requireNotNull(nukkitSections)[chunkSectionY] ?: return null
155 | val internalX = tileX % 32
156 | val internalY = tileY % 32
157 | val internalZ = tileZ % 32
158 | val offset = ((internalY and 0xF) shl 8) + ((internalZ and 0xF) shl 4) + (internalX and 0xF)
159 | val blockIdInPosition = chunkSection.blocks[offset].toInt()
160 | // Item Frame in Bedrock Edition is a block and not an entity, check if we aren't replacing any block.
161 | if (blockIdInPosition != 0) {
162 | return null
163 | }
164 | val facing = when (javaEntity.getByte("Facing").toInt()) {
165 | 0, 1 -> return null // Facing down and up is unsupported by Bedrock Edition
166 | 2 -> 3
167 | 3 -> 2
168 | 4 -> 5
169 | 5 -> 4
170 | else -> 3
171 | }
172 | chunkSection.blocks[offset] = (199 and 0xFF).toByte()
173 | val halfOffset = offset / 2
174 | val isSecond = offset % 2 == 1
175 | val stored = if (!isSecond) {
176 | facing to ((chunkSection.blocksData[halfOffset].toInt() and 0xF0) shr 4)
177 | } else {
178 | (chunkSection.blocksData[halfOffset].toInt() and 0x0F) to facing
179 | }
180 | val first = stored.first and 0x0F
181 | val second = (stored.second and 0x0F) shl 4
182 | val merged = first or second
183 | chunkSection.blocksData[halfOffset] = (merged and 0xFF).toByte()
184 | val tileEntity = NbtCompound(
185 | "id" to NbtString("ItemFrame"),
186 | "x" to NbtInt(tileX),
187 | "y" to NbtInt(tileY),
188 | "z" to NbtInt(tileZ),
189 | "isMoveable" to NbtByte(false)
190 | )
191 | tileEntity.copyFrom(javaEntity, "ItemDropChance")
192 | tileEntity.copyFrom(javaEntity, "ItemRotation")
193 | javaEntity.getNullableCompound("Item")?.toNukkitItem(worldConverter)?.let {
194 | tileEntity["Item"] = it
195 | }
196 | requireNotNull(nukkitTileEntities)[BlockPos(tileX, tileY, tileZ)] = tileEntity
197 | null
198 | }
199 | else -> null
200 | }
201 | }
202 |
203 | internal fun NbtCompound.entityToId(): Int? {
204 | val javaId = getNullableString("id")?.toLowerCase()?.removePrefix("minecraft:") ?: return null
205 | return java2bedrockEntities[javaId].takeUnless { it == 0 }
206 | }
207 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/internal/integrity-check.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc.internal
2 |
3 | import br.com.gamemods.j2nwc.WorldConverter
4 | import java.util.*
5 |
6 | internal object IdComparator: Comparator> {
7 | override fun compare(entry1: Map.Entry, entry2: Map.Entry): Int {
8 | val (blockId1, blockData1) = entry1.value.split(',', limit = 2).map { it.toInt() }
9 | val (blockId2, blockData2) = entry2.value.split(',', limit = 2).map { it.toInt() }
10 | return blockId1.compareTo(blockId2).takeIf { it != 0 }
11 | ?: blockData1.compareTo(blockData2).takeIf { it != 0 }
12 | ?: entry1.key.compareTo(entry2.key)
13 | }
14 | }
15 |
16 | internal object TypeIdComparator: Comparator> {
17 | override fun compare(entry1: Map.Entry, entry2: Map.Entry): Int {
18 | val (type1, blockId1, blockData1) = entry1.value.split(',', limit = 3)
19 | val (type2, blockId2, blockData2) = entry2.value.split(',', limit = 3)
20 | return type1.compareTo(type2).takeIf { it != 0 }
21 | ?: blockId1.toInt().compareTo(blockId2.toInt()).takeIf { it != 0 }
22 | ?: (blockData1.takeIf { it != "~" }?.toInt() ?: -1)
23 | .compareTo(blockData2.takeIf { it != "~" }?.toInt() ?: -1).takeIf { it != 0 }
24 | ?: entry1.key.compareTo(entry2.key)
25 | }
26 | }
27 |
28 | internal fun checkIds(targetType: WorldConverter.TargetType) {
29 | val validBlockPattern = Regex("""^\d+,\d+$""")
30 | java2bedrockStates.values.find { !validBlockPattern.matches(it) }?.let {
31 | error("Found an invalid mapping at block-states.properties: $it")
32 | }
33 |
34 |
35 | val validKeyPattern = Regex("""^(B,\d+,\d+)|(I,\d+,(\d+|~))$""")
36 | java2bedrockItems.values.find { !validKeyPattern.matches(it) }?.let {
37 | error("Found an invalid mapping at items.properties: $it")
38 | }
39 |
40 | val validItemValuePattern = Regex("""^\d+,(\d+|~)$""")
41 | val bedrock2target = targetType.bedrock2target
42 | bedrock2target.forEach { k, v ->
43 | val key = k.toString()
44 | if (!validKeyPattern.matches(key)) {
45 | error("Found an invalid key at bedrock-2-nukkit.properties: $key")
46 | }
47 |
48 | if (key[0] == 'B') {
49 | if (!validBlockPattern.matches(v.toString())) {
50 | error("Found an invalid value at bedrock-2-nukkit.properties: Key:$key Value:$v")
51 | }
52 | } else {
53 | if (!validItemValuePattern.matches(v.toString())) {
54 | error("Found an invalid value at bedrock-2-nukkit.properties: Key:$key Value:$v")
55 | }
56 | }
57 | }
58 |
59 | val blockNames = targetType.blockNames
60 | val validDamage = 0..targetType.maxDataValue
61 | java2bedrockStates.asSequence().sortedWith(IdComparator).forEach { (state, stateMapping) ->
62 | val (mappedBlockId, mappedBlockData) = stateMapping.split(',', limit = 2).map { it.toInt() }
63 | val (nukkitBlockId, nukkitBlockData) =
64 | (bedrock2target["B,$mappedBlockId,$mappedBlockData"]?.toString() ?: stateMapping)
65 | .split(',', limit = 2).map { it.toInt() }
66 |
67 | if (nukkitBlockId !in blockNames) {
68 | error("The block $nukkitBlockId,$nukkitBlockData is unsupported by the target type $targetType!\nState: $state")
69 | }
70 |
71 | if (nukkitBlockData !in validDamage) {
72 | error("The block $nukkitBlockId,$nukkitBlockData has data out of range 0..${targetType.maxDataValue} " +
73 | "and is unsupported by the target type $targetType!\nState: $state")
74 | }
75 | }
76 |
77 | val itemNames = targetType.itemNames
78 | val suprpessWarningItemIds = targetType.suprpessWarningItemIds
79 | java2bedrockItems.asSequence().sortedWith(TypeIdComparator).forEach { (item, stateMapping) ->
80 | val (type, mappedItemId, mappedItemData) = stateMapping.split(',', limit = 3)
81 | val (nukkitItemId, nukkitItemData) =
82 | (bedrock2target["$type,$mappedItemId,$mappedItemData"]?.toString()
83 | ?: bedrock2target["$type,$mappedItemId,~"]?.toString()
84 | ?: "$mappedItemId,$mappedItemData")
85 | .split(',', limit = 2).mapIndexed { i, str->
86 | when {
87 | i == 0 -> str
88 | str == "~" -> mappedItemData
89 | else -> str
90 | }
91 | }
92 |
93 | if (type == "I") {
94 |
95 | val itemId = nukkitItemId.toInt()
96 | if (itemId !in suprpessWarningItemIds && itemId !in itemNames) {
97 | println("The item $type,$nukkitItemId,$nukkitItemData is unsupported by the target type $targetType!\nItem: $item")
98 | }
99 |
100 | } else {
101 | if (nukkitItemId.toInt() !in blockNames) {
102 | println("The item-block $type,$nukkitItemId,$nukkitItemData is unsupported the target type $targetType!\nItem: $item")
103 | }
104 | }
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/internal/item-converter.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc.internal
2 |
3 | import br.com.gamemods.j2nwc.WorldConverter
4 | import br.com.gamemods.nbtmanipulator.NbtCompound
5 | import br.com.gamemods.nbtmanipulator.NbtList
6 | import br.com.gamemods.nbtmanipulator.NbtString
7 | import java.util.concurrent.ThreadLocalRandom
8 |
9 | internal fun NbtCompound.toNukkitInventory(
10 | worldConverter: WorldConverter,
11 | nukkitInventory: NbtCompound,
12 | slotRemapper: (Int) -> Int = { it }
13 | ) {
14 | val javaItems = getNullableCompoundList("Items") ?: return
15 | val nukkitItems = javaItems.map { javaItem ->
16 | javaItem.toNukkitItem(worldConverter).also { nukkitItem ->
17 | nukkitItem["Slot"] = slotRemapper(javaItem.getByte("Slot").toInt()).toByte()
18 | }
19 | }
20 | nukkitInventory["Items"] = NbtList(nukkitItems)
21 | }
22 |
23 | internal fun NbtCompound.toNukkitItem(worldConverter: WorldConverter): NbtCompound {
24 | val nukkitItem = NbtCompound()
25 | nukkitItem.copyFrom(this, "Count")
26 | val javaId = getString("id")
27 | val nbt = getNullableCompound("tag") ?: NbtCompound()
28 | val damage = nbt.getNullableInt("Damage") ?: 0
29 | val internalId = javaId.removePrefix("minecraft:").toLowerCase()
30 | val bedrockMapping = java2bedrockItems[internalId] ?: "B,0,0"
31 | val (type, bedrockId, rawBedrockData) = bedrockMapping.split(',', limit = 3)
32 | val bedrockData = rawBedrockData.takeUnless { it == "~" }?.toInt() ?: damage
33 | val bedrock2target = worldConverter.targetType.bedrock2target
34 | val nukkitMapping = bedrock2target.getProperty("$type,$bedrockId,$bedrockData")
35 | ?: bedrock2target.getProperty("$type,$bedrockId,$rawBedrockData")
36 | ?: "$bedrockId,$bedrockData"
37 | val (rawNukkitId, rawNukkitData) = nukkitMapping.split(',', limit = 2)
38 | val nukkitData = rawNukkitData.takeUnless { it == "~" }?.toInt() ?: damage
39 |
40 | val nukkitId = if (type == "B" && rawNukkitId.toInt() > 255) {
41 | 255 - rawNukkitId.toInt()
42 | } else {
43 | rawNukkitId.toInt()
44 | }
45 |
46 | nukkitItem["id"] = nukkitId.toShort()
47 |
48 | val customNukkitData = when (nukkitId) {
49 | 383 -> { // spawn_egg
50 | val entity = javaId.removeSuffix("_spawn_egg").removePrefix("minecraft:")
51 | java2bedrockEntities[entity] ?: 0
52 | }
53 | 262 -> { // arrow and tipped_arrow
54 | val potionInfo = nbt.getNullableString("Potion")?.removePrefix("minecraft:")
55 | if (potionInfo == null) {
56 | nukkitData
57 | } else {
58 | tippedArrows[potionInfo] ?: 0
59 | }
60 | }
61 | 373, 438, 441 -> { // potions
62 | val potionInfo = nbt.getNullableString("Potion")?.removePrefix("minecraft:")
63 | if (potionInfo == null) {
64 | nukkitData
65 | } else {
66 | javaPotions2Bedrock[potionInfo] ?: 0
67 | }
68 | }
69 | else -> nukkitData
70 | }
71 |
72 | val nukkitNbt = NbtCompound()
73 | nukkitNbt.copyFrom(nbt, "Unbreakable")
74 | nukkitNbt.copyFrom(nbt, "HideFlags")
75 | nbt.getNullableCompound("display")?.also { display ->
76 | val nukkitDisplay = NbtCompound()
77 | nukkitNbt["display"] = nukkitDisplay
78 | display.copyJsonToLegacyTo(nukkitDisplay, "Name")
79 | nukkitDisplay.copyFrom(display, "Lore")
80 | display.getNullableInt("color")?.let {
81 | nukkitNbt["customColor"] = it
82 | }
83 | }
84 |
85 | nbt.getNullableStringList("CanDestroy")?.also { canDestroy ->
86 | val nukkitCanDestroy = NbtList(canDestroy.flatMap {tag ->
87 | worldConverter.targetType.javaBlockProps2Target[tag.value]?.map { name -> NbtString(name) } ?: listOf(tag)
88 | })
89 | nukkitNbt["CanDestroy"] = nukkitCanDestroy
90 | }
91 |
92 | nbt.getNullableStringList("CanPlaceOn")?.also { canPlaceOn ->
93 | val nukkitCanPlaceOn = NbtList(canPlaceOn.flatMap { tag ->
94 | worldConverter.targetType.javaBlockProps2Target[tag.value]?.map { name -> NbtString(name) } ?: listOf(tag)
95 | })
96 | nukkitNbt["CanPlaceOn"] = nukkitCanPlaceOn
97 | }
98 |
99 | val enchantments = nbt.getNullableCompoundList("Enchantments") ?: emptyList()
100 | val storedEnchantments = nbt.getNullableCompoundList("StoredEnchantments") ?: emptyList()
101 |
102 | (enchantments.asSequence() + storedEnchantments.asSequence())
103 | .mapNotNull(::convertEnch)
104 | .toMutableList()
105 | .takeIf { it.isNotEmpty() }
106 | ?.also { nukkitNbt["ench"] = NbtList(it) }
107 |
108 | nbt.copyTo(nukkitNbt, "RepairCost")
109 |
110 | when (nukkitId) {
111 | 386 -> { // writable_book
112 | nbt.getNullableStringList("pages")?.map {
113 | NbtCompound("text" to it)
114 | }?.also {
115 | nukkitNbt["pages"] = NbtList(it)
116 | }
117 | }
118 | 387 -> { // written_book
119 | nukkitNbt.copyFrom(nbt, "author")
120 | nukkitNbt.copyFrom(nbt, "title")
121 | nukkitNbt.copyFrom(nbt, "generation")
122 | nbt.getNullableStringList("pages")?.map {
123 | NbtCompound("text" to NbtString(it.value.fromJsonToLegacy()))
124 | }?.also {
125 | nukkitNbt["pages"] = NbtList(it)
126 | }
127 | nukkitNbt["id"] = 1095216660480L + ThreadLocalRandom.current().nextLong(0L, 2147483647L)
128 | }
129 | 401, 402 -> { // firework, firework star
130 | fun NbtCompound.convertExplosion(): NbtCompound {
131 | val converted = NbtCompound()
132 | copyToRenaming(converted, "Flicker", "FireworkFlicker")
133 | copyToRenaming(converted, "Trail", "FireworkTrail")
134 | copyToRenaming(converted, "Type", "FireworkType")
135 | getNullableIntArray("Colors")?.map { it.fireworkColorToDyeColor() }?.also {
136 | converted["FireworkColor"] = it.toByteArray()
137 | }
138 | getNullableIntArray("FadeColors")?.map { it.fireworkColorToDyeColor() }?.also {
139 | converted["FireworkFade"] = it.toByteArray()
140 | }
141 | return converted
142 | }
143 |
144 | when (nukkitId) {
145 | 401 -> { // firework
146 | nbt.getNullableCompound("Fireworks")?.also { fireworks ->
147 | val convertedFireworks = NbtCompound()
148 | convertedFireworks.copyFrom(fireworks, "Flight")
149 |
150 | fireworks.getNullableCompoundList("Explosions")?.also { explosions ->
151 | convertedFireworks["Explosions"] = NbtList(
152 | explosions.map { it.convertExplosion() }
153 | )
154 | }
155 |
156 | nukkitNbt["Fireworks"] = convertedFireworks
157 | }
158 | }
159 | 402 -> { // firework star
160 | nbt.getNullableCompound("Explosion")?.also { explosion ->
161 | explosion.getNullableIntArray("Colors")?.firstOrNull()?.also { customColor ->
162 | nukkitNbt["customColor"] = customColor - 0x1000000
163 | }
164 | nukkitNbt["FireworksItem"] = explosion.convertExplosion()
165 | }
166 | }
167 | }
168 | }
169 | }
170 |
171 | if (customNukkitData != 0) {
172 | nukkitItem["Damage"] = customNukkitData.toShort()
173 | }
174 | if (nukkitNbt.isNotEmpty()) {
175 | nukkitItem["tag"] = nukkitNbt
176 | }
177 | return nukkitItem
178 | }
179 |
180 | internal fun convertEnch(from: NbtCompound): NbtCompound? {
181 | val id = javaEnchantments2Nukkit[from.getNullableString("id")?.removePrefix("minecraft:") ?: ""]
182 | ?.takeIf { it >= 0 }
183 | ?: return null
184 |
185 | return NbtCompound().also { to ->
186 | to["id"] = id.toShort()
187 | from.copyTo(to, "lvl")
188 | }
189 | }
190 |
191 | internal fun NbtCompound.copyToRenaming(to: NbtCompound, tagName: String, newName: String) {
192 | this[tagName]?.let {
193 | to[newName] = it
194 | }
195 | }
196 |
197 | private fun Int.fireworkColorToDyeColor(): Byte = when (this) {
198 | 15790320 -> 15
199 | 15435844 -> 14
200 | 12801229 -> 13
201 | 6719955 -> 12
202 | 14602026 -> 11
203 | 4312372 -> 10
204 | 14188952 -> 9
205 | 4408131 -> 8
206 | 11250603 -> 7
207 | 2651799 -> 6
208 | 8073150 -> 5
209 | 2437522 -> 4
210 | 5320730 -> 3
211 | 3887386 -> 2
212 | 11743532 -> 1
213 | 1973019 -> 0
214 | else -> 4
215 | }
216 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/internal/properties.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc.internal
2 |
3 | import java.util.*
4 |
5 | internal fun properties(name: String) = Properties().apply {
6 | JavaPalette::class.java.getResourceAsStream(name).bufferedReader().use {
7 | load(it)
8 | }
9 | }
10 |
11 | private fun propertiesStringString(name: String) = properties(name)
12 | .mapKeys { it.key.toString().toLowerCase() }.mapValues { it.value.toString() }
13 |
14 | internal fun propertiesStringInt(name: String) = properties(name)
15 | .mapKeys { it.key.toString().toLowerCase() }.mapValues { it.value.toString().toInt() }
16 |
17 | internal val java2bedrockEntities = propertiesStringInt("/entity-ids.properties")
18 |
19 | internal val java2bedrockStates = propertiesStringString("/block-states.properties").entries.asSequence().flatMap { e->
20 | if (";waterlogged-false" in e.key) {
21 | sequenceOf(e.toPair(), e.key.replace(";waterlogged-false", "") to e.value)
22 | } else {
23 | sequenceOf(e.toPair())
24 | }
25 | }.flatMap { e ->
26 | if (";powered-false" in e.first && e.first.matches(Regex("^[^_]+_trapdoor;.*"))) {
27 | sequenceOf(e, e.first.replace(";powered-false", "") to e.second)
28 | } else {
29 | sequenceOf(e)
30 | }
31 | }.toMap()
32 |
33 | internal val java2bedrockItems = propertiesStringString("/items.properties")
34 |
35 | internal val javaStatusEffectNames = properties("/status-effect-java-ids.properties")
36 | .mapKeys { it.key.toString().toInt() }.mapValues { it.value.toString().toLowerCase() }
37 |
38 | internal val javaStatusEffectIds = javaStatusEffectNames.entries.associate { it.value to it.key }
39 | internal val java2bedrockEffectIds = propertiesStringInt("/status-effect-ids.properties")
40 |
41 | internal val javaTags = properties("/tags.properties")
42 | .mapKeys { it.key.toString().toLowerCase() }.mapValues { entry ->
43 | entry.value.toString().split(',').map { it.trim() }
44 | }.let { tags2bedrock ->
45 | val mutable = tags2bedrock.toMutableMap()
46 | while (mutable.values.any { list-> list.any { it.startsWith("#") } }) {
47 | mutable.iterator().forEach { entry ->
48 | if (entry.value.any { it.startsWith('#') }) {
49 | entry.setValue(entry.value.flatMap {
50 | if (it.startsWith('#')) {
51 | (mutable[it.substring(1)]?.asSequence() ?: sequenceOf()).asIterable()
52 | } else {
53 | sequenceOf(it).asIterable()
54 | }
55 | }.toSet().toList())
56 | }
57 | }
58 | }
59 | mutable
60 | }
61 |
62 | internal val tippedArrows = propertiesStringInt("/tipped-arrows.properties")
63 |
64 | internal data class PaintingData(val id: String, val width: Int, val height: Int)
65 | internal val paintings = propertiesStringString("/paintings.properties")
66 | .mapValues { (_, value) ->
67 | val (id, width, height) = value.split(',', limit = 3)
68 | PaintingData(id, width.toInt(), height.toInt())
69 | }
70 | internal val javaEntities2Nukkit = propertiesStringString("/java-entities.properties")
71 |
72 | internal val javaEnchantments2Nukkit = propertiesStringInt("/enchantments.properties")
73 |
74 | internal val javaPotions2Bedrock = propertiesStringInt("/potions.properties")
75 |
76 | internal val javaBiomes2Bedrock = properties("/biomes.properties").asSequence()
77 | .map { it.key.toString().substringBefore('-').toInt() to it.value.toString().toInt().toByte() }
78 | .toMap()
79 |
80 | internal val javaBiomesString2Bedrock = properties("/biomes.properties").asSequence()
81 | .map { it.key.toString().substringAfter('-') to it.value.toString().toInt().toByte() }
82 | .toMap()
83 |
84 | internal val javaInheritedWaterlogging = JavaPalette::class.java.getResourceAsStream("/java-inherited-waterlogging.txt").bufferedReader().use {
85 | it.readLines()
86 | }.toSet()
87 |
--------------------------------------------------------------------------------
/src/main/kotlin/br/com/gamemods/j2nwc/internal/text-converter.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc.internal
2 |
3 | import br.com.gamemods.nbtmanipulator.NbtCompound
4 | import net.md_5.bungee.api.ChatColor
5 | import net.md_5.bungee.chat.ComponentSerializer
6 |
7 | internal fun NbtCompound.copyJsonToLegacyTo(other: NbtCompound, tagName: String, defaultLegacy: String? = null) {
8 | val value = this.getNullableString(tagName)?.fromJsonToLegacy() ?: defaultLegacy
9 | if (value != null) {
10 | other[tagName] = value
11 | }
12 | }
13 |
14 | internal fun String.fromJsonToLegacy(): String {
15 | val components = ComponentSerializer.parse(this)
16 | val nulls = components.count { it == null }
17 | if (nulls > 0) {
18 | println("WARNING: The parsed Array contains $nulls null value(s)!")
19 | println("WARNING: Original JSON: $this")
20 | }
21 | val string = components.asSequence().filterNotNull().map { component ->
22 | if (component.colorRaw == null) {
23 | component.color = ChatColor.RESET
24 | }
25 | component.toLegacyText()
26 | }.joinToString().removePrefix("\u00A7r")
27 | return string
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/resources/bedrock-2-nukkit.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | #command_block -> crafting_table
3 | B,137,0=58,0
4 | B,137,10=58,0
5 | B,137,13=58,0
6 | B,137,11=58,0
7 | B,137,12=58,0
8 | B,137,9=58,0
9 | B,137,8=58,0
10 | B,137,2=58,0
11 | B,137,5=58,0
12 | B,137,3=58,0
13 | B,137,4=58,0
14 | B,137,1=58,0
15 |
16 | #repeating_command_block -> crafting_table
17 | B,188,0=58,0
18 | B,188,10=58,0
19 | B,188,13=58,0
20 | B,188,11=58,0
21 | B,188,12=58,0
22 | B,188,9=58,0
23 | B,188,8=58,0
24 | B,188,2=58,0
25 | B,188,5=58,0
26 | B,188,3=58,0
27 | B,188,4=58,0
28 | B,188,1=58,0
29 |
30 | #chain_command_block -> crafting_table
31 | B,189,0=58,0
32 | B,189,10=58,0
33 | B,189,13=58,0
34 | B,189,11=58,0
35 | B,189,12=58,0
36 | B,189,9=58,0
37 | B,189,8=58,0
38 | B,189,2=58,0
39 | B,189,5=58,0
40 | B,189,3=58,0
41 | B,189,4=58,0
42 | B,189,1=58,0
43 |
44 | #structure_block -> purpur_block
45 | B,252,0=201,0
46 | B,252,2=201,0
47 | B,252,3=201,0
48 | B,252,4=201,0
49 | B,252,1=201,0
50 |
51 | #seagrass -> water
52 | B,385,0=9,0
53 | B,385,1=9,0
54 | B,385,2=9,0
55 |
56 | #kelp -> water
57 | B,393,0=9,0
58 | B,393,1=9,0
59 | B,393,2=9,0
60 | B,393,3=9,0
61 | B,393,4=9,0
62 | B,393,5=9,0
63 | B,393,6=9,0
64 | B,393,7=9,0
65 | B,393,8=9,0
66 | B,393,9=9,0
67 | B,393,10=9,0
68 | B,393,11=9,0
69 | B,393,12=9,0
70 | B,393,13=9,0
71 | B,393,14=9,0
72 | B,393,15=9,0
73 |
74 | #bubble_column -> water
75 | B,415,0=9,0
76 | B,415,1=9,0
77 |
78 | #bamboo -> sugarcane
79 | B,418,0=83,15
80 | B,418,2=83,15
81 | B,418,4=83,15
82 | B,418,1=83,15
83 | B,418,3=83,15
84 | B,418,5=83,15
85 |
86 | #bamboo_sapling -> sugarcane
87 | B,419,0=83,15
88 |
89 | #scaffolding -> ladder facing north
90 | B,420,0=65,2
91 | B,420,1=65,2
92 | B,420,2=65,2
93 | B,420,3=65,2
94 | B,420,4=65,2
95 | B,420,5=65,2
96 | B,420,6=65,2
97 | B,420,7=65,2
98 | B,420,8=65,2
99 | B,420,9=65,2
100 | B,420,10=65,2
101 | B,420,11=65,2
102 | B,420,12=65,2
103 | B,420,13=65,2
104 | B,420,14=65,2
105 | B,420,15=65,2
106 |
107 | #mossy_stone_brick_slab -> stone_brick_slab
108 | B,421,8=44,13
109 | B,421,0=44,5
110 | B,423,0=43,5
111 |
112 | #smooth_quartz_slab -> quartz_slab
113 | B,421,9=44,14
114 | B,421,1=44,6
115 | B,423,1=43,6
116 |
117 | #stone_slab -> smooth_stone_slab
118 | B,421,10=44,8
119 | B,421,2=44,0
120 | B,423,2=43,0
121 |
122 | #cut_sandstone_slab -> sandstone_slab
123 | B,421,11=44,9
124 | B,421,3=44,1
125 | B,423,3=43,1
126 |
127 | #cut_red_sandstone_slab -> red_sandstone_slab
128 | B,421,12=182,8
129 | B,421,4=182,0
130 | B,423,4=181,0
131 |
132 | #spruce_sign -> oak_sign
133 | B,436,0=63,0
134 | B,436,1=63,1
135 | B,436,2=63,2
136 | B,436,3=63,3
137 | B,436,4=63,4
138 | B,436,5=63,5
139 | B,436,6=63,6
140 | B,436,7=63,7
141 | B,436,8=63,8
142 | B,436,9=63,9
143 | B,436,10=63,10
144 | B,436,11=63,11
145 | B,436,12=63,12
146 | B,436,13=63,13
147 | B,436,14=63,14
148 | B,436,15=63,15
149 |
150 | #spruce_wall_sign -> oak_wall_sign
151 | B,437,0=68,0
152 | B,437,2=68,2
153 | B,437,3=68,3
154 | B,437,4=68,4
155 | B,437,5=68,5
156 |
157 | #smooth_stone -> double smooth_stone_slab
158 | B,438,0=43,0
159 |
160 | #birch_sign -> oak_sign
161 | B,441,0=63,0
162 | B,441,1=63,1
163 | B,441,2=63,2
164 | B,441,3=63,3
165 | B,441,4=63,4
166 | B,441,5=63,5
167 | B,441,6=63,6
168 | B,441,7=63,7
169 | B,441,8=63,8
170 | B,441,9=63,9
171 | B,441,10=63,10
172 | B,441,11=63,11
173 | B,441,12=63,12
174 | B,441,13=63,13
175 | B,441,14=63,14
176 | B,441,15=63,15
177 |
178 | #birch_wall_sign -> oak_wall_sign
179 | B,442,0=68,0
180 | B,442,2=68,2
181 | B,442,3=68,3
182 | B,442,4=68,4
183 | B,442,5=68,5
184 |
185 | #jungle_sign -> oak_sign
186 | B,443,0=63,0
187 | B,443,1=63,1
188 | B,443,2=63,2
189 | B,443,3=63,3
190 | B,443,4=63,4
191 | B,443,5=63,5
192 | B,443,6=63,6
193 | B,443,7=63,7
194 | B,443,8=63,8
195 | B,443,9=63,9
196 | B,443,10=63,10
197 | B,443,11=63,11
198 | B,443,12=63,12
199 | B,443,13=63,13
200 | B,443,14=63,14
201 | B,443,15=63,15
202 |
203 | #jungle_wall_sign -> oak_wall_sign
204 | B,444,0=68,0
205 | B,444,2=68,2
206 | B,444,3=68,3
207 | B,444,4=68,4
208 | B,444,5=68,5
209 |
210 | #acacia_sign -> oak_sign
211 | B,445,0=63,0
212 | B,445,1=63,1
213 | B,445,2=63,2
214 | B,445,3=63,3
215 | B,445,4=63,4
216 | B,445,5=63,5
217 | B,445,6=63,6
218 | B,445,7=63,7
219 | B,445,8=63,8
220 | B,445,9=63,9
221 | B,445,10=63,10
222 | B,445,11=63,11
223 | B,445,12=63,12
224 | B,445,13=63,13
225 | B,445,14=63,14
226 | B,445,15=63,15
227 |
228 | #acacia_wall_sign -> oak_wall_sign
229 | B,446,0=68,0
230 | B,446,2=68,2
231 | B,446,3=68,3
232 | B,446,4=68,4
233 | B,446,5=68,5
234 |
235 | #dark_oak_sign -> oak_sign
236 | B,447,0=63,0
237 | B,447,1=63,1
238 | B,447,2=63,2
239 | B,447,3=63,3
240 | B,447,4=63,4
241 | B,447,5=63,5
242 | B,447,6=63,6
243 | B,447,7=63,7
244 | B,447,8=63,8
245 | B,447,9=63,9
246 | B,447,10=63,10
247 | B,447,11=63,11
248 | B,447,12=63,12
249 | B,447,13=63,13
250 | B,447,14=63,14
251 | B,447,15=63,15
252 |
253 | #dark_oak_wall_sign -> oak_wall_sign
254 | B,448,0=68,0
255 | B,448,2=68,2
256 | B,448,3=68,3
257 | B,448,4=68,4
258 | B,448,5=68,5
259 |
260 | #grindstone -> crafting_table
261 | B,450,0=58,0
262 | B,450,1=58,0
263 | B,450,2=58,0
264 | B,450,3=58,0
265 | B,450,4=58,0
266 | B,450,5=58,0
267 | B,450,6=58,0
268 | B,450,7=58,0
269 | B,450,8=58,0
270 | B,450,9=58,0
271 | B,450,10=58,0
272 | B,450,11=58,0
273 |
274 | #smoker -> furnace
275 | B,454,0=62,0
276 | B,454,1=62,1
277 | B,454,2=62,2
278 | B,453,0=61,0
279 | B,453,1=61,1
280 | B,453,2=61,2
281 | B,454,3=62,3
282 | B,453,3=61,3
283 | B,454,4=62,4
284 | B,453,4=61,4
285 | B,454,5=62,5
286 | B,453,5=61,5
287 |
288 | #cartography_table -> crafting_table
289 | B,455,0=58,0
290 |
291 | #barrel -> chest
292 | B,458,2=54,2
293 | B,458,10=54,2
294 | B,458,5=54,5
295 | B,458,13=54,5
296 | B,458,3=54,3
297 | B,458,11=54,3
298 | B,458,4=54,4
299 | B,458,12=54,4
300 | B,458,1=54,2
301 | B,458,9=54,2
302 | B,458,0=54,2
303 | B,458,8=54,2
304 |
305 | #sweet_berry_bush -> grass
306 | B,462,0=31,0
307 | B,462,1=31,0
308 | B,462,2=31,0
309 | B,462,3=31,0
310 |
311 | #campfire (lit) -> magma
312 | B,464,0=213,0
313 | B,464,1=213,0
314 | B,464,2=213,0
315 | B,464,3=213,0
316 |
317 | #campfire (unlit) -> obsidian
318 | B,464,4=49,0
319 | B,464,5=49,0
320 | B,464,6=49,0
321 | B,464,7=49,0
322 |
323 | #jigsaw -> purpur_block
324 | B,466,2=201,0
325 | B,466,5=201,0
326 | B,466,3=201,0
327 | B,466,4=201,0
328 | B,466,1=201,0
329 | B,466,0=201,0
330 |
331 | #lantern (floor) -> standing torch
332 | B,463,0=50,5
333 |
334 | #lantern (celling) -> glowstone
335 | B,463,1=89,0
336 |
337 | #lectern -> crafting_table
338 | B,449,4=58,0
339 | B,449,0=58,0
340 | B,449,6=58,0
341 | B,449,2=58,0
342 | B,449,5=58,0
343 | B,449,1=58,0
344 | B,449,7=58,0
345 | B,449,3=58,0
346 |
347 | #blast_furnace -> furnace
348 | B,469,0=62,0
349 | B,469,1=62,1
350 | B,469,2=62,2
351 | B,451,0=61,0
352 | B,451,1=61,1
353 | B,451,2=61,2
354 | B,469,3=62,3
355 | B,451,3=61,3
356 | B,469,4=62,4
357 | B,451,4=61,4
358 | B,469,5=62,5
359 | B,451,5=61,5
360 |
361 | #fletching_table -> crafting_table
362 | B,456,0=58,0
363 |
364 | #smithing_table -> crafting_table
365 | B,457,0=58,0
366 |
367 | #stonecutter -> enchanting_table
368 | B,452,0=116,0
369 | B,452,2=116,0
370 | B,452,3=116,0
371 | B,452,4=116,0
372 | B,452,5=116,0
373 |
374 | #loom -> crafting_table
375 | B,459,0=58,0
376 | B,459,1=58,0
377 | B,459,2=58,0
378 | B,459,3=58,0
379 |
380 | #composter -> cauldron
381 | B,468,0=118,0
382 | B,468,1=118,1
383 | B,468,2=118,1
384 | B,468,3=118,1
385 | B,468,4=118,2
386 | B,468,5=118,2
387 | B,468,6=118,2
388 | B,468,7=118,3
389 | B,468,8=118,3
390 |
391 | #bell (on floor) -> anvil
392 | B,461,18=145,0
393 | B,461,2=145,0
394 | B,461,16=145,2
395 | B,461,0=145,2
396 | B,461,17=145,1
397 | B,461,1=145,1
398 | B,461,19=145,3
399 | B,461,3=145,3
400 |
401 | #bell (on wall and celling) -> stone brick wall
402 | B,461,22=139,7
403 | B,461,6=139,7
404 | B,461,20=139,7
405 | B,461,4=139,7
406 | B,461,21=139,7
407 | B,461,5=139,7
408 | B,461,23=139,7
409 | B,461,7=139,7
410 | B,461,26=139,7
411 | B,461,10=139,7
412 | B,461,24=139,7
413 | B,461,8=139,7
414 | B,461,25=139,7
415 | B,461,9=139,7
416 | B,461,27=139,7
417 | B,461,11=139,7
418 | B,461,30=139,7
419 | B,461,14=139,7
420 | B,461,28=139,7
421 | B,461,12=139,7
422 | B,461,29=139,7
423 | B,461,13=139,7
424 | B,461,31=139,7
425 | B,461,15=139,7
426 |
427 | #prismarine_stairs -> cobblestone_stairs
428 | B,257,7=67,7
429 | B,257,3=67,3
430 | B,257,6=67,6
431 | B,257,2=67,2
432 | B,257,5=67,5
433 | B,257,1=67,1
434 | B,257,4=67,4
435 | B,257,0=67,0
436 |
437 | #dark_prismarine_stairs -> stone_brick_stairs
438 | B,258,7=109,7
439 | B,258,3=109,3
440 | B,258,6=109,6
441 | B,258,2=109,2
442 | B,258,5=109,5
443 | B,258,1=109,1
444 | B,258,4=109,4
445 | B,258,0=109,0
446 |
447 | #prismarine_brick_stairs -> mossy_stone_brick_stairs
448 | B,259,7=109,7
449 | B,259,3=109,3
450 | B,259,6=109,6
451 | B,259,2=109,2
452 | B,259,5=109,5
453 | B,259,1=109,1
454 | B,259,4=109,4
455 | B,259,0=109,0
456 |
457 | #stripped_spruce_log -> spruce_log
458 | B,260,0=17,5
459 | B,260,1=17,1
460 | B,260,2=17,9
461 | B,260,3=17,13
462 |
463 | #stripped_birch_log -> birch_log
464 | B,261,1=17,6
465 | B,261,0=17,2
466 | B,261,2=17,10
467 | B,261,3=17,14
468 |
469 | #stripped_jungle_log -> jungle_log
470 | B,262,1=17,7
471 | B,262,0=17,3
472 | B,262,2=17,11
473 | B,262,3=17,15
474 |
475 | #stripped_acacia_log -> acacia_log
476 | B,263,1=162,4
477 | B,263,0=162,0
478 | B,263,2=162,8
479 | B,263,3=162,12
480 |
481 | #stripped_dark_oak_log -> dark_oak_log
482 | B,264,1=162,5
483 | B,264,0=162,1
484 | B,264,2=162,9
485 | B,264,3=162,13
486 |
487 | #stripped_oak_log -> oak_log
488 | B,265,1=17,4
489 | B,265,0=17,0
490 | B,265,2=17,8
491 | B,265,3=17,12
492 |
493 | #blue_ice -> packed_ice
494 | B,266,0=174,0
495 |
496 | #tube_coral -> water
497 | B,386,0=9,0
498 | B,386,1=9,0
499 | B,386,2=9,0
500 | B,386,3=9,0
501 | B,386,4=9,0
502 |
503 | #tube_coral_block -> water
504 | B,387,5=9,0
505 | B,387,6=9,0
506 | B,387,7=9,0
507 | B,387,8=9,0
508 | B,387,9=9,0
509 | B,387,0=9,0
510 | B,387,1=9,0
511 | B,387,2=9,0
512 | B,387,3=9,0
513 | B,387,4=9,0
514 |
515 | #tube_coral_fan -> water
516 | B,388,0=9,0
517 | B,388,1=9,0
518 | B,388,2=9,0
519 | B,388,3=9,0
520 | B,388,4=9,0
521 | B,388,5=9,0
522 | B,388,6=9,0
523 | B,388,7=9,0
524 | B,388,8=9,0
525 | B,388,9=9,0
526 | B,388,10=9,0
527 | B,388,11=9,0
528 | B,388,12=9,0
529 | B,388,13=9,0
530 | B,388,14=9,0
531 | B,388,15=9,0
532 | B,389,0=9,0
533 | B,389,1=9,0
534 | B,389,2=9,0
535 | B,389,3=9,0
536 | B,389,4=9,0
537 | B,389,5=9,0
538 | B,389,6=9,0
539 | B,389,7=9,0
540 | B,389,8=9,0
541 | B,389,9=9,0
542 | B,389,10=9,0
543 | B,389,11=9,0
544 | B,389,12=9,0
545 | B,389,13=9,0
546 | B,389,14=9,0
547 | B,389,15=9,0
548 | B,390,0=9,0
549 | B,390,1=9,0
550 | B,390,2=9,0
551 | B,390,3=9,0
552 | B,390,4=9,0
553 | B,390,5=9,0
554 | B,390,6=9,0
555 | B,390,7=9,0
556 | B,390,8=9,0
557 | B,390,9=9,0
558 | B,390,10=9,0
559 | B,390,11=9,0
560 | B,390,12=9,0
561 | B,390,13=9,0
562 | B,390,14=9,0
563 | B,390,15=9,0
564 |
565 | # bubble_coral_wall_fan -> water
566 | B,391,0=9,0
567 | B,391,1=9,0
568 | B,391,2=9,0
569 | B,391,3=9,0
570 | B,391,4=9,0
571 | B,391,5=9,0
572 | B,391,6=9,0
573 | B,391,7=9,0
574 | B,391,8=9,0
575 | B,391,9=9,0
576 | B,391,10=9,0
577 | B,391,11=9,0
578 | B,391,12=9,0
579 | B,391,13=9,0
580 | B,391,14=9,0
581 | B,391,15=9,0
582 |
583 | # horn_coral_wall_fan -> water
584 | B,392,0=9,0
585 | B,392,1=9,0
586 | B,392,2=9,0
587 | B,392,3=9,0
588 | B,392,4=9,0
589 | B,392,5=9,0
590 | B,392,6=9,0
591 | B,392,7=9,0
592 | B,392,8=9,0
593 | B,392,9=9,0
594 | B,392,10=9,0
595 | B,392,11=9,0
596 | B,392,12=9,0
597 | B,392,13=9,0
598 | B,392,14=9,0
599 | B,392,15=9,0
600 |
601 | #dried_kelp_block -> coal_block
602 | B,394,0=173,0
603 |
604 | #acacia_button -> oak_button
605 | B,395,0=143,0
606 | B,395,1=143,1
607 | B,395,2=143,2
608 | B,395,3=143,3
609 | B,395,4=143,4
610 | B,395,5=143,5
611 | B,395,6=143,6
612 | B,395,7=143,7
613 | B,395,8=143,8
614 | B,395,9=143,9
615 | B,395,10=143,10
616 | B,395,11=143,11
617 | B,395,12=143,12
618 | B,395,13=143,13
619 | B,395,14=143,14
620 | B,395,15=143,15
621 |
622 | #birch_button -> oak_button
623 | B,396,0=143,0
624 | B,396,1=143,1
625 | B,396,2=143,2
626 | B,396,3=143,3
627 | B,396,4=143,4
628 | B,396,5=143,5
629 | B,396,6=143,6
630 | B,396,7=143,7
631 | B,396,8=143,8
632 | B,396,9=143,9
633 | B,396,10=143,10
634 | B,396,11=143,11
635 | B,396,12=143,12
636 | B,396,13=143,13
637 | B,396,14=143,14
638 | B,396,15=143,15
639 |
640 | #dark_oak_button -> oak_button
641 | B,397,0=143,0
642 | B,397,1=143,1
643 | B,397,2=143,2
644 | B,397,3=143,3
645 | B,397,4=143,4
646 | B,397,5=143,5
647 | B,397,6=143,6
648 | B,397,7=143,7
649 | B,397,8=143,8
650 | B,397,9=143,9
651 | B,397,10=143,10
652 | B,397,11=143,11
653 | B,397,12=143,12
654 | B,397,13=143,13
655 | B,397,14=143,14
656 | B,397,15=143,15
657 |
658 | #jungle_button -> oak_button
659 | B,398,0=143,0
660 | B,398,1=143,1
661 | B,398,2=143,2
662 | B,398,3=143,3
663 | B,398,4=143,4
664 | B,398,5=143,5
665 | B,398,6=143,6
666 | B,398,7=143,7
667 | B,398,8=143,8
668 | B,398,9=143,9
669 | B,398,10=143,10
670 | B,398,11=143,11
671 | B,398,12=143,12
672 | B,398,13=143,13
673 | B,398,14=143,14
674 | B,398,15=143,15
675 |
676 | #spruce_button -> oak_button
677 | B,399,0=143,0
678 | B,399,1=143,1
679 | B,399,2=143,2
680 | B,399,3=143,3
681 | B,399,4=143,4
682 | B,399,5=143,5
683 | B,399,6=143,6
684 | B,399,7=143,7
685 | B,399,8=143,8
686 | B,399,9=143,9
687 | B,399,10=143,10
688 | B,399,11=143,11
689 | B,399,12=143,12
690 | B,399,13=143,13
691 | B,399,14=143,14
692 | B,399,15=143,15
693 |
694 | #acacia_trapdoor -> oak_trapdoor
695 | B,400,0=96,0
696 | B,400,1=96,1
697 | B,400,2=96,2
698 | B,400,3=96,3
699 | B,400,4=96,4
700 | B,400,5=96,5
701 | B,400,6=96,6
702 | B,400,7=96,7
703 | B,400,8=96,8
704 | B,400,9=96,9
705 | B,400,10=96,10
706 | B,400,11=96,11
707 | B,400,12=96,12
708 | B,400,13=96,13
709 | B,400,14=96,14
710 | B,400,15=96,15
711 |
712 | #birch_trapdoor -> oak_trapdoor
713 | B,401,0=96,0
714 | B,401,1=96,1
715 | B,401,2=96,2
716 | B,401,3=96,3
717 | B,401,4=96,4
718 | B,401,5=96,5
719 | B,401,6=96,6
720 | B,401,7=96,7
721 | B,401,8=96,8
722 | B,401,9=96,9
723 | B,401,10=96,10
724 | B,401,11=96,11
725 | B,401,12=96,12
726 | B,401,13=96,13
727 | B,401,14=96,14
728 | B,401,15=96,15
729 |
730 | #jungle_trapdoor -> oak_trapdoor
731 | B,403,0=96,0
732 | B,403,1=96,1
733 | B,403,2=96,2
734 | B,403,3=96,3
735 | B,403,4=96,4
736 | B,403,5=96,5
737 | B,403,6=96,6
738 | B,403,7=96,7
739 | B,403,8=96,8
740 | B,403,9=96,9
741 | B,403,10=96,10
742 | B,403,11=96,11
743 | B,403,12=96,12
744 | B,403,13=96,13
745 | B,403,14=96,14
746 | B,403,15=96,15
747 |
748 | #acacia_pressure_plate -> oak_pressure_plate
749 | B,405,0=72,0
750 | B,405,1=72,1
751 |
752 | #birch_pressure_plate -> oak_pressure_plate
753 | B,406,0=72,0
754 | B,406,1=72,1
755 |
756 | #dark_oak_pressure_plate -> oak_pressure_plate
757 | B,407,0=72,0
758 | B,407,1=72,1
759 |
760 | #jungle_pressure_plate -> oak_pressure_plate
761 | B,408,0=72,0
762 | B,408,1=72,1
763 |
764 | #spruce_pressure_plate -> oak_pressure_plate
765 | B,409,0=72,0
766 | B,409,1=72,1
767 |
768 | #carved_pumpkin -> pumpkin
769 | B,410,2=86,0
770 | B,410,0=86,0
771 | B,410,1=86,0
772 | B,410,3=86,0
773 |
774 | #sea_pickle (waterlogged) -> water
775 | B,411,0=9,0
776 | B,411,1=9,0
777 | B,411,2=9,0
778 | B,411,3=9,0
779 |
780 | #sea_pickle (non-waterlogged) -> air
781 | B,411,4=0,0
782 | B,411,5=0,0
783 | B,411,6=0,0
784 | B,411,7=0,0
785 |
786 | #conduit -> water
787 | B,412,0=9,0
788 |
789 | #turtle_egg -> air
790 | B,414,0=0,0
791 |
792 | #end_stone_brick_slab -> smooth_sandstone_slab
793 | B,417,8=182,14
794 | B,417,0=182,6
795 | B,422,0=181,6
796 |
797 | #smooth_red_sandstone_slab -> red_sandstone_slab
798 | B,417,9=182,8
799 | B,417,1=182,0
800 | B,422,1=181,0
801 |
802 | #polished_andesite_slab -> smooth_stone_slab
803 | B,417,10=44,8
804 | B,417,2=44,0
805 | B,422,2=43,0
806 |
807 | #andesite_slab -> smooth_stone_slab
808 | B,417,11=44,8
809 | B,417,3=44,0
810 | B,422,3=43,0
811 |
812 | #diorite_slab -> quartz_slab
813 | B,417,12=44,14
814 | B,417,4=44,6
815 | B,422,4=43,6
816 |
817 | #polished_diorite_slab -> quartz_slab
818 | B,417,13=44,14
819 | B,417,5=44,6
820 | B,422,5=43,6
821 |
822 | #granite_slab -> brick_slab
823 | B,417,14=44,12
824 | B,417,6=44,4
825 | B,422,6=43,4
826 |
827 | #polished_granite_slab -> red_sandstone_slab
828 | B,417,15=182,8
829 | B,417,7=182,0
830 | B,422,7=181,0
831 |
832 | #granite_stairs -> brick_stairs
833 | B,424,7=108,7
834 | B,424,3=108,3
835 | B,424,6=108,6
836 | B,424,2=108,2
837 | B,424,5=108,5
838 | B,424,1=108,1
839 | B,424,4=108,4
840 | B,424,0=108,0
841 |
842 |
843 | #diorite_stairs -> brick_stairs
844 | B,425,7=156,7
845 | B,425,3=156,3
846 | B,425,6=156,6
847 | B,425,2=156,2
848 | B,425,5=156,5
849 | B,425,1=156,1
850 | B,425,4=156,4
851 | B,425,0=156,0
852 |
853 | #andesite_stairs -> cobblestone_stairs
854 | B,426,7=67,7
855 | B,426,3=67,3
856 | B,426,6=67,6
857 | B,426,2=67,2
858 | B,426,5=67,5
859 | B,426,1=67,1
860 | B,426,4=67,4
861 | B,426,0=67,0
862 |
863 | #polished_granite_stairs -> red_sandstone_stairs
864 | B,427,7=180,7
865 | B,427,3=180,3
866 | B,427,6=180,6
867 | B,427,2=180,2
868 | B,427,5=180,5
869 | B,427,1=180,1
870 | B,427,4=180,4
871 | B,427,0=180,0
872 |
873 |
874 | #polished_diorite_stairs -> brick_stairs
875 | B,428,7=156,7
876 | B,428,3=156,3
877 | B,428,6=156,6
878 | B,428,2=156,2
879 | B,428,5=156,5
880 | B,428,1=156,1
881 | B,428,4=156,4
882 | B,428,0=156,0
883 |
884 |
885 | #polished_andesite_stairs -> stone_brick_stairs
886 | B,429,7=109,7
887 | B,429,3=109,3
888 | B,429,6=109,6
889 | B,429,2=109,2
890 | B,429,5=109,5
891 | B,429,1=109,1
892 | B,429,4=109,4
893 | B,429,0=109,0
894 |
895 |
896 | #mossy_stone_brick_stairs -> stone_brick_stairs
897 | B,430,7=109,7
898 | B,430,3=109,3
899 | B,430,6=109,6
900 | B,430,2=109,2
901 | B,430,5=109,5
902 | B,430,1=109,1
903 | B,430,4=109,4
904 | B,430,0=109,0
905 |
906 |
907 | #smooth_red_sandstone_stairs -> red_sandstone_stairs
908 | B,431,7=180,7
909 | B,431,3=180,3
910 | B,431,6=180,6
911 | B,431,2=180,2
912 | B,431,5=180,5
913 | B,431,1=180,1
914 | B,431,4=180,4
915 | B,431,0=180,0
916 |
917 | #smooth_sandstone_stairs -> sandstone_stairs
918 | B,432,7=128,7
919 | B,432,3=128,3
920 | B,432,6=128,6
921 | B,432,2=128,2
922 | B,432,5=128,5
923 | B,432,1=128,1
924 | B,432,4=128,4
925 | B,432,0=128,0
926 |
927 |
928 | #end_stone_brick_stairs -> sandstone_stairs
929 | B,433,7=128,7
930 | B,433,3=128,3
931 | B,433,6=128,6
932 | B,433,2=128,2
933 | B,433,5=128,5
934 | B,433,1=128,1
935 | B,433,4=128,4
936 | B,433,0=128,0
937 |
938 | #mossy_coblestone_stairs -> cobblestone_stairs
939 | B,434,7=67,7
940 | B,434,3=67,3
941 | B,434,6=67,6
942 | B,434,2=67,2
943 | B,434,5=67,5
944 | B,434,1=67,1
945 | B,434,4=67,4
946 | B,434,0=67,0
947 |
948 |
949 | #stone_stairs -> stone_brick_stairs
950 | B,435,7=109,7
951 | B,435,3=109,3
952 | B,435,6=109,6
953 | B,435,2=109,2
954 | B,435,5=109,5
955 | B,435,1=109,1
956 | B,435,4=109,4
957 | B,435,0=109,0
958 |
959 | #red_nether_brick_stairs -> nether_brick_stairs
960 | B,439,7=114,7
961 | B,439,3=114,3
962 | B,439,6=114,6
963 | B,439,2=114,2
964 | B,439,5=114,5
965 | B,439,1=114,1
966 | B,439,4=114,4
967 | B,439,0=114,0
968 |
969 | #smooth_quartz_stairs -> quartz_stairs
970 | B,440,7=156,7
971 | B,440,3=156,3
972 | B,440,6=156,6
973 | B,440,2=156,2
974 | B,440,5=156,5
975 | B,440,1=156,1
976 | B,440,4=156,4
977 | B,440,0=156,0
978 |
979 | #barrier -> invisible_bedrock
980 | B,416,0=95,0
981 |
982 | #dark_oak_trapdoor -> oak_trapdoor
983 | B,402,13=96,13
984 | B,402,9=96,9
985 | B,402,5=96,5
986 | B,402,1=96,1
987 | B,402,12=96,12
988 | B,402,8=96,8
989 | B,402,4=96,4
990 | B,402,0=96,0
991 | B,402,15=96,15
992 | B,402,11=96,11
993 | B,402,7=96,7
994 | B,402,3=96,3
995 | B,402,14=96,14
996 | B,402,10=96,10
997 | B,402,6=96,6
998 | B,402,2=96,2
999 |
1000 | #spruce_trapdoor -> oak_trapdoor
1001 | B,404,13=96,13
1002 | B,404,9=96,9
1003 | B,404,5=96,5
1004 | B,404,1=96,1
1005 | B,404,12=96,12
1006 | B,404,8=96,8
1007 | B,404,4=96,4
1008 | B,404,0=96,0
1009 | B,404,15=96,15
1010 | B,404,11=96,11
1011 | B,404,7=96,7
1012 | B,404,3=96,3
1013 | B,404,14=96,14
1014 | B,404,10=96,10
1015 | B,404,6=96,6
1016 | B,404,2=96,2
1017 |
1018 | #stickypistonarmcollision -> pistonarmcollision
1019 | B,472,0=34,0
1020 | B,472,1=34,1
1021 | B,472,2=34,2
1022 | B,472,3=34,3
1023 | B,472,4=34,4
1024 | B,472,5=34,5
1025 |
1026 | #bee_nest -> air
1027 | B,473,0=0,0
1028 | B,473,2=0,0
1029 | B,473,10=0,0
1030 | B,473,18=0,0
1031 | B,473,26=0,0
1032 | B,473,34=0,0
1033 | B,473,42=0,0
1034 | B,473,3=0,0
1035 | B,473,11=0,0
1036 | B,473,19=0,0
1037 | B,473,27=0,0
1038 | B,473,35=0,0
1039 | B,473,43=0,0
1040 | B,473,4=0,0
1041 | B,473,12=0,0
1042 | B,473,20=0,0
1043 | B,473,28=0,0
1044 | B,473,36=0,0
1045 | B,473,44=0,0
1046 | B,473,5=0,0
1047 | B,473,13=0,0
1048 | B,473,21=0,0
1049 | B,473,29=0,0
1050 | B,473,37=0,0
1051 | B,473,45=0,0
1052 |
1053 | #beehive -> oak_planks
1054 | B,474,0=5,0
1055 | B,474,2=5,0
1056 | B,474,10=5,0
1057 | B,474,18=5,0
1058 | B,474,26=5,0
1059 | B,474,34=5,0
1060 | B,474,42=5,0
1061 | B,474,3=5,0
1062 | B,474,11=5,0
1063 | B,474,19=5,0
1064 | B,474,27=5,0
1065 | B,474,35=5,0
1066 | B,474,43=5,0
1067 | B,474,4=5,0
1068 | B,474,12=5,0
1069 | B,474,20=5,0
1070 | B,474,28=5,0
1071 | B,474,36=5,0
1072 | B,474,44=5,0
1073 | B,474,5=5,0
1074 | B,474,13=5,0
1075 | B,474,21=5,0
1076 | B,474,29=5,0
1077 | B,474,37=5,0
1078 | B,474,45=5,0
1079 |
1080 | #honey_block -> slime_block
1081 | B,475,0=165,0
1082 |
1083 | #honeycomb_block -> yellow_glazed_terracotta
1084 | B,476,0=224,0
1085 |
1086 | #crossbow -> bow
1087 | I,471,~=261,~
1088 |
1089 | #spruce_sign -> oak_sign
1090 | I,472,~=323,0
1091 |
1092 | #birch_sign -> oak_sign
1093 | I,473,~=323,0
1094 |
1095 | #jungle_sign -> oak_sign
1096 | I,474,~=323,0
1097 |
1098 | #acacia_sign -> oak_sign
1099 | I,475,~=323,0
1100 |
1101 | #dark_oak_sign -> oak_sign
1102 | I,476,~=323,0
1103 |
1104 | #globe_banner_pattern -> flower_banner_pattern (when supported by Nukkit, currently replace it to air)
1105 | I,434,4=434,2
1106 |
1107 | #banner_pattern -> air
1108 | #I,434,0=0,0
1109 | #I,434,1=0,0
1110 | #I,434,2=0,0
1111 | #I,434,3=0,0
1112 | #I,434,4=0,0
1113 |
1114 | #honeycomb -> air
1115 | #I,736,~=0,0
1116 |
1117 | #honey_bottle -> mushroom_stew
1118 | #I,737,~=282,0
1119 |
--------------------------------------------------------------------------------
/src/main/resources/bedrock-2-powernukkit.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | #command_block -> crafting_table
3 | B,137,0=58,0
4 | B,137,10=58,0
5 | B,137,13=58,0
6 | B,137,11=58,0
7 | B,137,12=58,0
8 | B,137,9=58,0
9 | B,137,8=58,0
10 | B,137,2=58,0
11 | B,137,5=58,0
12 | B,137,3=58,0
13 | B,137,4=58,0
14 | B,137,1=58,0
15 |
16 | #repeating_command_block -> crafting_table
17 | B,188,0=58,0
18 | B,188,10=58,0
19 | B,188,13=58,0
20 | B,188,11=58,0
21 | B,188,12=58,0
22 | B,188,9=58,0
23 | B,188,8=58,0
24 | B,188,2=58,0
25 | B,188,5=58,0
26 | B,188,3=58,0
27 | B,188,4=58,0
28 | B,188,1=58,0
29 |
30 | #chain_command_block -> crafting_table
31 | B,189,0=58,0
32 | B,189,10=58,0
33 | B,189,13=58,0
34 | B,189,11=58,0
35 | B,189,12=58,0
36 | B,189,9=58,0
37 | B,189,8=58,0
38 | B,189,2=58,0
39 | B,189,5=58,0
40 | B,189,3=58,0
41 | B,189,4=58,0
42 | B,189,1=58,0
43 |
44 | #structure_block -> purpur_block
45 | B,252,0=201,0
46 | B,252,2=201,0
47 | B,252,3=201,0
48 | B,252,4=201,0
49 | B,252,1=201,0
50 |
51 | #crossbow -> bow
52 | I,471,~=261,~
53 |
54 | #globe_banner_pattern -> flower_banner_pattern (when supported by Nukkit, currently replace it to air)
55 | I,434,4=434,2
56 |
57 | #banner_pattern -> air
58 | #I,434,0=0,0
59 | #I,434,1=0,0
60 | #I,434,2=0,0
61 | #I,434,3=0,0
62 | #I,434,4=0,0
63 |
64 | #honeycomb -> air
65 | #I,736,~=0,0
66 |
67 | #honey_bottle -> mushroom_stew
68 | #I,737,~=282,0
69 |
--------------------------------------------------------------------------------
/src/main/resources/biomes.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | # Generated on Minecraft 1.14 at 2019-05-31 20:40:29 BRT
3 | 0-ocean=0
4 | 1-plains=1
5 | 2-desert=2
6 | 3-mountains=3
7 | 4-forest=4
8 | 5-taiga=5
9 | 6-swamp=6
10 | 7-river=7
11 | 8-nether=8
12 | 9-the_end=8
13 | 10-frozen_ocean=10
14 | 11-frozen_river=11
15 | 12-snowy_tundra=12
16 | 13-snowy_mountains=12
17 | 14-mushroom_fields=14
18 | 15-mushroom_field_shore=15
19 | 16-beach=16
20 | 17-desert_hills=17
21 | 18-wooded_hills=18
22 | 19-taiga_hills=19
23 | 20-mountain_edge=20
24 | 21-jungle=21
25 | 22-jungle_hills=22
26 | 23-jungle_edge=23
27 | 24-deep_ocean=24
28 | 25-stone_shore=25
29 | 26-snowy_beach=26
30 | 27-birch_forest=27
31 | 28-birch_forest_hills=28
32 | 29-dark_forest=29
33 | 30-snowy_taiga=30
34 | 31-snowy_taiga_hills=31
35 | 32-giant_tree_taiga=32
36 | 33-giant_tree_taiga_hills=33
37 | 34-wooded_mountains=34
38 | 35-savanna=35
39 | 36-savanna_plateau=36
40 | 37-badlands=37
41 | 38-wooded_badlands_plateau=38
42 | 39-badlands_plateau=39
43 | 40-small_end_islands=0
44 | 41-end_midlands=8
45 | 42-end_highlands=8
46 | 43-end_barrens=8
47 | 44-warm_ocean=0
48 | 45-lukewarm_ocean=0
49 | 46-cold_ocean=0
50 | 47-deep_warm_ocean=24
51 | 48-deep_lukewarm_ocean=24
52 | 49-deep_cold_ocean=24
53 | 50-deep_frozen_ocean=24
54 | 127-the_void=1
55 | 129-sunflower_plains=129
56 | 130-desert_lakes=130
57 | 131-gravelly_mountains=131
58 | 132-flower_forest=132
59 | 133-taiga_mountains=133
60 | 134-swamp_hills=134
61 | 140-ice_spikes=140
62 | 149-modified_jungle=149
63 | 151-modified_jungle_edge=151
64 | 155-tall_birch_forest=155
65 | 156-tall_birch_hills=156
66 | 157-dark_forest_hills=157
67 | 158-snowy_taiga_mountains=158
68 | 160-giant_spruce_taiga=160
69 | 161-giant_spruce_taiga_hills=0
70 | 162-modified_gravelly_mountains=162
71 | 163-shattered_savanna=163
72 | 164-shattered_savanna_plateau=164
73 | 165-eroded_badlands=165
74 | 166-modified_wooded_badlands_plateau=166
75 | 167-modified_badlands_plateau=167
76 | 168-bamboo_jungle=21
77 | 169-bamboo_jungle_hills=22
78 |
--------------------------------------------------------------------------------
/src/main/resources/enchantments.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | # Generated on Minecraft 1.14 at 2019-05-25 02:17:33 BRT
3 | protection=0
4 | fire_protection=1
5 | feather_falling=2
6 | blast_protection=3
7 | projectile_protection=4
8 | respiration=6
9 | aqua_affinity=8
10 | thorns=5
11 | depth_strider=7
12 | frost_walker=25
13 | binding_curse=27
14 | sharpness=9
15 | smite=10
16 | bane_of_arthropods=11
17 | knockback=12
18 | fire_aspect=13
19 | looting=14
20 | sweeping=-1
21 | efficiency=15
22 | silk_touch=16
23 | unbreaking=17
24 | fortune=18
25 | power=19
26 | punch=20
27 | flame=21
28 | infinity=22
29 | luck_of_the_sea=23
30 | lure=24
31 | loyalty=31
32 | impaling=29
33 | riptide=30
34 | channeling=32
35 | multishot=-1
36 | quick_charge=-1
37 | piercing=-1
38 | mending=26
39 | vanishing_curse=28
40 |
--------------------------------------------------------------------------------
/src/main/resources/entity-ids.properties:
--------------------------------------------------------------------------------
1 | # Generated on Minecraft 1.14 at 2019-05-18 13:46:41 BRT
2 | # suppress inspection "UnusedProperty" for whole file
3 | area_effect_cloud=95
4 | armor_stand=61
5 | arrow=80
6 | bat=19
7 | blaze=43
8 | boat=90
9 | cat=75
10 | cave_spider=40
11 | chicken=10
12 | cod=112
13 | cow=11
14 | creeper=33
15 | donkey=24
16 | dolphin=31
17 | dragon_fireball=79
18 | drowned=110
19 | elder_guardian=50
20 | end_crystal=71
21 | ender_dragon=53
22 | enderman=38
23 | endermite=55
24 | evoker_fangs=103
25 | evoker=104
26 | experience_orb=69
27 | eye_of_ender=70
28 | falling_block=66
29 | firework_rocket=72
30 | fox=0
31 | ghast=41
32 | giant=0
33 | guardian=49
34 | horse=23
35 | husk=47
36 | illusioner=0
37 | item=64
38 | item_frame=0
39 | fireball=385
40 | leash_knot=88
41 | llama=29
42 | llama_spit=102
43 | magma_cube=42
44 | minecart=84
45 | chest_minecart=98
46 | command_block_minecart=100
47 | furnace_minecart=0
48 | hopper_minecart=96
49 | spawner_minecart=0
50 | tnt_minecart=97
51 | mule=25
52 | mooshroom=16
53 | ocelot=22
54 | painting=83
55 | panda=113
56 | parrot=30
57 | pig=12
58 | pufferfish=108
59 | zombie_pigman=36
60 | polar_bear=28
61 | tnt=65
62 | rabbit=18
63 | salmon=109
64 | sheep=18
65 | shulker=54
66 | shulker_bullet=76
67 | silverfish=39
68 | skeleton=34
69 | skeleton_horse=26
70 | slime=37
71 | small_fireball=94
72 | snow_golem=21
73 | snowball=81
74 | spectral_arrow=80
75 | spider=35
76 | squid=17
77 | stray=46
78 | trader_llama=29
79 | tropical_fish=111
80 | turtle=74
81 | egg=82
82 | ender_pearl=87
83 | experience_bottle=68
84 | potion=86
85 | trident=73
86 | vex=105
87 | villager=115
88 | iron_golem=20
89 | vindicator=57
90 | pillager=114
91 | wandering_trader=118
92 | witch=45
93 | wither=52
94 | wither_skeleton=48
95 | wither_skull=89
96 | wolf=14
97 | zombie=32
98 | zombie_horse=27
99 | zombie_villager=116
100 | phantom=58
101 | ravager=59
102 | lightning_bolt=93
103 | player=63
104 | fishing_bobber=77
105 | bee=122
106 |
--------------------------------------------------------------------------------
/src/main/resources/items.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | # Generated on Minecraft 1.14 at 2019-05-15 20:23:06 BRT
3 | air=B,0,0
4 | stone=B,1,0
5 | granite=B,1,1
6 | polished_granite=B,1,2
7 | diorite=B,1,3
8 | polished_diorite=B,1,4
9 | andesite=B,1,5
10 | polished_andesite=B,1,6
11 | grass_block=B,2,0
12 | dirt=B,3,0
13 | coarse_dirt=B,1,1
14 | podzol=B,243,0
15 | cobblestone=B,4,0
16 | oak_planks=B,5,0
17 | spruce_planks=B,5,1
18 | birch_planks=B,5,2
19 | jungle_planks=B,5,3
20 | acacia_planks=B,5,4
21 | dark_oak_planks=B,5,5
22 | oak_sapling=B,6,0
23 | spruce_sapling=B,6,1
24 | birch_sapling=B,6,2
25 | jungle_sapling=B,6,3
26 | acacia_sapling=B,6,4
27 | dark_oak_sapling=B,6,5
28 | bedrock=B,7,0
29 | sand=B,12,0
30 | red_sand=B,12,1
31 | gravel=B,13,0
32 | gold_ore=B,14,0
33 | iron_ore=B,15,0
34 | coal_ore=B,16,0
35 | oak_log=B,17,0
36 | spruce_log=B,17,1
37 | birch_log=B,17,2
38 | jungle_log=B,17,3
39 | acacia_log=B,162,0
40 | dark_oak_log=B,162,1
41 | stripped_oak_log=B,265,0
42 | stripped_spruce_log=B,260,0
43 | stripped_birch_log=B,261,0
44 | stripped_jungle_log=B,262,0
45 | stripped_acacia_log=B,263,0
46 | stripped_dark_oak_log=B,264,0
47 | stripped_oak_wood=B,265,3
48 | stripped_spruce_wood=B,260,3
49 | stripped_birch_wood=B,261,3
50 | stripped_jungle_wood=B,262,3
51 | stripped_acacia_wood=B,263,3
52 | stripped_dark_oak_wood=B,263,3
53 | oak_wood=B,17,12
54 | spruce_wood=B,17,13
55 | birch_wood=B,17,14
56 | jungle_wood=B,17,15
57 | acacia_wood=B,162,12
58 | dark_oak_wood=B,162,13
59 | oak_leaves=B,18,0
60 | spruce_leaves=B,18,1
61 | birch_leaves=B,18,2
62 | jungle_leaves=B,18,3
63 | acacia_leaves=B,161,0
64 | dark_oak_leaves=B,161,1
65 | sponge=B,19,0
66 | wet_sponge=B,19,1
67 | glass=B,20,0
68 | lapis_ore=B,21,0
69 | lapis_block=B,22,0
70 | dispenser=B,23,0
71 | sandstone=B,24,0
72 | chiseled_sandstone=B,24,1
73 | cut_sandstone=B,24,2
74 | note_block=B,25,0
75 | powered_rail=B,27,0
76 | detector_rail=B,28,0
77 | sticky_piston=B,29,0
78 | cobweb=B,30,0
79 | grass=B,31,0
80 | fern=B,31,1
81 | dead_bush=B,32,0
82 | seagrass=B,385,0
83 | sea_pickle=B,411,0
84 | piston=B,32,0
85 | white_wool=B,35,0
86 | orange_wool=B,35,1
87 | magenta_wool=B,35,2
88 | light_blue_wool=B,35,3
89 | yellow_wool=B,35,4
90 | lime_wool=B,35,5
91 | pink_wool=B,35,6
92 | gray_wool=B,35,7
93 | light_gray_wool=B,35,8
94 | cyan_wool=B,35,9
95 | purple_wool=B,35,10
96 | blue_wool=B,35,11
97 | brown_wool=B,35,12
98 | green_wool=B,35,13
99 | red_wool=B,35,14
100 | black_wool=B,35,15
101 | dandelion=B,37,0
102 | poppy=B,38,0
103 | blue_orchid=B,38,1
104 | allium=B,38,2
105 | azure_bluet=B,38,3
106 | red_tulip=B,38,4
107 | orange_tulip=B,38,5
108 | white_tulip=B,38,6
109 | pink_tulip=B,38,7
110 | oxeye_daisy=B,38,8
111 | cornflower=B,38,9
112 | lily_of_the_valley=B,38,10
113 | # Missing
114 | wither_rose=B,0,0
115 | brown_mushroom=B,39,0
116 | red_mushroom=B,40,0
117 | gold_block=B,41,0
118 | iron_block=B,42,0
119 | oak_slab=B,158,0
120 | spruce_slab=B,158,1
121 | birch_slab=B,158,2
122 | jungle_slab=B,158,3
123 | acacia_slab=B,158,4
124 | dark_oak_slab=B,158,5
125 | stone_slab=B,421,2
126 | smooth_stone_slab=B,44,0
127 | sandstone_slab=B,44,1
128 | cut_sandstone_slab=B,421,3
129 | petrified_oak_slab=B,1,0
130 | cobblestone_slab=B,44,3
131 | brick_slab=B,44,4
132 | stone_brick_slab=B,44,5
133 | nether_brick_slab=B,44,6
134 | quartz_slab=B,44,7
135 | red_sandstone_slab=B,182,0
136 | cut_red_sandstone_slab=B,421,4
137 | purpur_slab=B,182,1
138 | prismarine_slab=B,182,2
139 | prismarine_brick_slab=B,182,3
140 | dark_prismarine_slab=B,182,4
141 | smooth_quartz=B,155,3
142 | smooth_red_sandstone=B,179,3
143 | smooth_sandstone=B,24,3
144 | smooth_stone=B,438,0
145 | bricks=B,45,0
146 | tnt=B,46,0
147 | bookshelf=B,47,0
148 | mossy_cobblestone=B,48,0
149 | obsidian=B,49,0
150 | torch=B,50,0
151 | end_rod=B,208,0
152 | chorus_plant=B,240,0
153 | chorus_flower=B,200,0
154 | purpur_block=B,201,0
155 | purpur_pillar=B,201,2
156 | purpur_stairs=B,203,0
157 | spawner=B,52,0
158 | oak_stairs=B,53,0
159 | chest=B,54,0
160 | diamond_ore=B,56,0
161 | diamond_block=B,57,0
162 | crafting_table=B,58,0
163 | farmland=B,60,0
164 | furnace=B,61,0
165 | ladder=B,65,0
166 | rail=B,66,0
167 | cobblestone_stairs=B,67,0
168 | lever=B,69,0
169 | stone_pressure_plate=B,70,0
170 | oak_pressure_plate=B,72,0
171 | spruce_pressure_plate=B,409,0
172 | birch_pressure_plate=B,406,0
173 | jungle_pressure_plate=B,408,0
174 | acacia_pressure_plate=B,405,0
175 | dark_oak_pressure_plate=B,407,0
176 | redstone_ore=B,73,0
177 | redstone_torch=B,76,0
178 | stone_button=B,77,0
179 | snow=B,78,0
180 | ice=B,79,0
181 | snow_block=B,80,0
182 | cactus=B,81,0
183 | clay=B,82,0
184 | jukebox=B,83,0
185 | oak_fence=B,85,0
186 | spruce_fence=B,85,1
187 | birch_fence=B,85,2
188 | jungle_fence=B,85,3
189 | acacia_fence=B,85,4
190 | dark_oak_fence=B,85,5
191 | pumpkin=B,86,0
192 | carved_pumpkin=B,410,0
193 | netherrack=B,87,0
194 | soul_sand=B,88,0
195 | glowstone=B,89,0
196 | jack_o_lantern=B,91,0
197 | oak_trapdoor=B,96,0
198 | spruce_trapdoor=B,404,0
199 | birch_trapdoor=B,401,0
200 | jungle_trapdoor=B,403,0
201 | acacia_trapdoor=B,400,0
202 | dark_oak_trapdoor=B,402,0
203 | infested_stone=B,97,0
204 | infested_cobblestone=B,91,1
205 | infested_stone_bricks=B,97,2
206 | infested_mossy_stone_bricks=B,97,3
207 | infested_cracked_stone_bricks=B,97,4
208 | infested_chiseled_stone_bricks=B,97,5
209 | stone_bricks=B,98,0
210 | mossy_stone_bricks=B,98,1
211 | cracked_stone_bricks=B,98,2
212 | chiseled_stone_bricks=B,98,3
213 | brown_mushroom_block=B,99,0
214 | red_mushroom_block=B,100,0
215 | mushroom_stem=B,100,10
216 | iron_bars=B,101,0
217 | glass_pane=B,102,0
218 | melon=B,103,0
219 | vine=B,106,0
220 | oak_fence_gate=B,107,0
221 | spruce_fence_gate=B,183,0
222 | birch_fence_gate=B,184,0
223 | jungle_fence_gate=B,185,0
224 | acacia_fence_gate=B,187,0
225 | dark_oak_fence_gate=B,186,0
226 | brick_stairs=B,108,0
227 | stone_brick_stairs=B,109,0
228 | mycelium=B,110,0
229 | lily_pad=B,111,0
230 | nether_bricks=B,112,0
231 | nether_brick_fence=B,113,0
232 | nether_brick_stairs=B,114,0
233 | enchanting_table=B,116,0
234 | end_portal_frame=B,120,0
235 | end_stone=B,121,0
236 | end_stone_bricks=B,206,0
237 | dragon_egg=B,122,0
238 | redstone_lamp=B,123,0
239 | sandstone_stairs=B,128,0
240 | emerald_ore=B,129,0
241 | ender_chest=B,130,0
242 | tripwire_hook=B,131,0
243 | emerald_block=B,133,0
244 | spruce_stairs=B,134,0
245 | birch_stairs=B,135,0
246 | jungle_stairs=B,136,0
247 | command_block=B,137,0
248 | beacon=B,138,0
249 | cobblestone_wall=B,139,0
250 | mossy_cobblestone_wall=B,139,1
251 | brick_wall=B,139,6
252 | prismarine_wall=B,139,11
253 | red_sandstone_wall=B,139,12
254 | mossy_stone_brick_wall=B,139,8
255 | granite_wall=B,139,2
256 | stone_brick_wall=B,139,7
257 | nether_brick_wall=B,139,10
258 | andesite_wall=B,139,4
259 | red_nether_brick_wall=B,139,13
260 | sandstone_wall=B,139,5
261 | end_stone_brick_wall=B,139,9
262 | diorite_wall=B,139,3
263 | oak_button=B,143,0
264 | spruce_button=B,399,0
265 | birch_button=B,396,0
266 | jungle_button=B,398,0
267 | acacia_button=B,395,0
268 | dark_oak_button=B,397,0
269 | anvil=B,145,0
270 | chipped_anvil=B,145,1
271 | damaged_anvil=B,145,2
272 | trapped_chest=B,146,0
273 | light_weighted_pressure_plate=B,147,0
274 | heavy_weighted_pressure_plate=B,148,0
275 | daylight_detector=B,151,0
276 | redstone_block=B,152,0
277 | nether_quartz_ore=B,153,0
278 | hopper=I,410,0
279 | chiseled_quartz_block=B,155,1
280 | quartz_block=B,155,0
281 | quartz_pillar=B,155,2
282 | quartz_stairs=B,156,0
283 | activator_rail=B,126,0
284 | dropper=B,125,0
285 | white_terracotta=B,159,0
286 | orange_terracotta=B,159,1
287 | magenta_terracotta=B,159,2
288 | light_blue_terracotta=B,159,3
289 | yellow_terracotta=B,159,4
290 | lime_terracotta=B,159,5
291 | pink_terracotta=B,159,6
292 | gray_terracotta=B,159,7
293 | light_gray_terracotta=B,159,8
294 | cyan_terracotta=B,159,9
295 | purple_terracotta=B,159,10
296 | blue_terracotta=B,159,11
297 | brown_terracotta=B,159,12
298 | green_terracotta=B,159,13
299 | red_terracotta=B,159,14
300 | black_terracotta=B,159,15
301 | barrier=B,416,0
302 | iron_trapdoor=B,167,0
303 | hay_block=B,170,0
304 | white_carpet=B,171,0
305 | orange_carpet=B,171,1
306 | magenta_carpet=B,171,2
307 | light_blue_carpet=B,171,3
308 | yellow_carpet=B,171,4
309 | lime_carpet=B,171,5
310 | pink_carpet=B,171,6
311 | gray_carpet=B,171,7
312 | light_gray_carpet=B,171,8
313 | cyan_carpet=B,171,9
314 | purple_carpet=B,171,10
315 | blue_carpet=B,171,11
316 | brown_carpet=B,171,12
317 | green_carpet=B,171,13
318 | red_carpet=B,171,14
319 | black_carpet=B,171,15
320 | terracotta=B,172,0
321 | coal_block=B,173,0
322 | packed_ice=B,174,0
323 | acacia_stairs=B,163,0
324 | dark_oak_stairs=B,164,0
325 | slime_block=B,165,0
326 | grass_path=B,198,0
327 | sunflower=B,175,0
328 | lilac=B,175,1
329 | rose_bush=B,175,4
330 | peony=B,175,8
331 | tall_grass=B,175,2
332 | large_fern=B,175,3
333 | white_stained_glass=B,95,0
334 | orange_stained_glass=B,95,1
335 | magenta_stained_glass=B,95,2
336 | light_blue_stained_glass=B,95,3
337 | yellow_stained_glass=B,95,4
338 | lime_stained_glass=B,95,5
339 | pink_stained_glass=B,95,6
340 | gray_stained_glass=B,95,7
341 | light_gray_stained_glass=B,95,8
342 | cyan_stained_glass=B,95,9
343 | purple_stained_glass=B,95,10
344 | blue_stained_glass=B,95,11
345 | brown_stained_glass=B,95,12
346 | green_stained_glass=B,95,13
347 | red_stained_glass=B,95,14
348 | black_stained_glass=B,95,15
349 | white_stained_glass_pane=B,160,0
350 | orange_stained_glass_pane=B,160,1
351 | magenta_stained_glass_pane=B,160,2
352 | light_blue_stained_glass_pane=B,160,3
353 | yellow_stained_glass_pane=B,160,4
354 | lime_stained_glass_pane=B,160,5
355 | pink_stained_glass_pane=B,160,6
356 | gray_stained_glass_pane=B,160,7
357 | light_gray_stained_glass_pane=B,160,8
358 | cyan_stained_glass_pane=B,160,9
359 | purple_stained_glass_pane=B,160,10
360 | blue_stained_glass_pane=B,160,11
361 | brown_stained_glass_pane=B,160,12
362 | green_stained_glass_pane=B,160,13
363 | red_stained_glass_pane=B,160,14
364 | black_stained_glass_pane=B,160,15
365 | prismarine=B,168,0
366 | prismarine_bricks=B,168,2
367 | dark_prismarine=B,168,1
368 | prismarine_stairs=B,257,0
369 | prismarine_brick_stairs=B,259,0
370 | dark_prismarine_stairs=B,258,0
371 | sea_lantern=B,169,0
372 | red_sandstone=B,179,0
373 | chiseled_red_sandstone=B,179,1
374 | cut_red_sandstone=B,179,2
375 | red_sandstone_stairs=B,180,0
376 | repeating_command_block=B,188,0
377 | chain_command_block=B,189,0
378 | magma_block=B,213,0
379 | nether_wart_block=B,214,0
380 | red_nether_bricks=B,215,0
381 | bone_block=B,216,0
382 | # Missing
383 | structure_void=B,0,0
384 | observer=B,251,0
385 | shulker_box=B,205,0
386 | white_shulker_box=B,218,0
387 | orange_shulker_box=B,218,1
388 | magenta_shulker_box=B,218,2
389 | light_blue_shulker_box=B,218,3
390 | yellow_shulker_box=B,218,4
391 | lime_shulker_box=B,218,5
392 | pink_shulker_box=B,218,6
393 | gray_shulker_box=B,218,7
394 | light_gray_shulker_box=B,218,8
395 | cyan_shulker_box=B,218,9
396 | purple_shulker_box=B,218,10
397 | blue_shulker_box=B,218,11
398 | brown_shulker_box=B,218,12
399 | green_shulker_box=B,218,13
400 | red_shulker_box=B,218,14
401 | black_shulker_box=B,218,15
402 | white_glazed_terracotta=B,220,0
403 | orange_glazed_terracotta=B,221,0
404 | magenta_glazed_terracotta=B,222,0
405 | light_blue_glazed_terracotta=B,223,0
406 | yellow_glazed_terracotta=B,224,0
407 | lime_glazed_terracotta=B,225,0
408 | pink_glazed_terracotta=B,226,0
409 | gray_glazed_terracotta=B,227,0
410 | light_gray_glazed_terracotta=B,228,0
411 | cyan_glazed_terracotta=B,229,0
412 | purple_glazed_terracotta=B,219,0
413 | blue_glazed_terracotta=B,231,0
414 | brown_glazed_terracotta=B,232,0
415 | green_glazed_terracotta=B,233,0
416 | red_glazed_terracotta=B,234,0
417 | black_glazed_terracotta=B,235,0
418 | white_concrete=B,236,0
419 | orange_concrete=B,236,1
420 | magenta_concrete=B,236,2
421 | light_blue_concrete=B,236,3
422 | yellow_concrete=B,236,4
423 | lime_concrete=B,236,5
424 | pink_concrete=B,236,6
425 | gray_concrete=B,236,7
426 | light_gray_concrete=B,236,8
427 | cyan_concrete=B,236,9
428 | purple_concrete=B,236,10
429 | blue_concrete=B,236,11
430 | brown_concrete=B,236,12
431 | green_concrete=B,236,13
432 | red_concrete=B,236,14
433 | black_concrete=B,236,15
434 | white_concrete_powder=B,237,0
435 | orange_concrete_powder=B,237,1
436 | magenta_concrete_powder=B,237,2
437 | light_blue_concrete_powder=B,237,3
438 | yellow_concrete_powder=B,237,4
439 | lime_concrete_powder=B,237,5
440 | pink_concrete_powder=B,237,6
441 | gray_concrete_powder=B,237,7
442 | light_gray_concrete_powder=B,237,8
443 | cyan_concrete_powder=B,237,9
444 | purple_concrete_powder=B,237,10
445 | blue_concrete_powder=B,237,11
446 | brown_concrete_powder=B,237,12
447 | green_concrete_powder=B,237,13
448 | red_concrete_powder=B,237,14
449 | black_concrete_powder=B,237,15
450 | turtle_egg=B,414,0
451 | dead_tube_coral_block=B,387,5
452 | dead_brain_coral_block=B,387,6
453 | dead_bubble_coral_block=B,387,7
454 | dead_fire_coral_block=B,387,8
455 | dead_horn_coral_block=B,387,9
456 | tube_coral_block=B,387,0
457 | brain_coral_block=B,387,1
458 | bubble_coral_block=B,387,2
459 | fire_coral_block=B,387,3
460 | horn_coral_block=B,387,4
461 | tube_coral=B,386,0
462 | brain_coral=B,386,1
463 | bubble_coral=B,386,2
464 | fire_coral=B,386,3
465 | horn_coral=B,386,4
466 | # Missing
467 | dead_brain_coral=B,0,0
468 | # Missing
469 | dead_bubble_coral=B,0,0
470 | # Missing
471 | dead_fire_coral=B,0,0
472 | # Missing
473 | dead_horn_coral=B,0,0
474 | # Missing
475 | dead_tube_coral=B,0,0
476 | tube_coral_fan=B,388,0
477 | # Missing
478 | brain_coral_fan=B,0,0
479 | # Missing
480 | bubble_coral_fan=B,0,0
481 | # Missing
482 | fire_coral_fan=B,0,0
483 | # Missing
484 | horn_coral_fan=B,0,0
485 | dead_tube_coral_fan=B,389,0
486 | # Missing
487 | dead_brain_coral_fan=B,0,0
488 | # Missing
489 | dead_bubble_coral_fan=B,0,0
490 | # Missing
491 | dead_fire_coral_fan=B,0,0
492 | # Missing
493 | dead_horn_coral_fan=B,0,0
494 | blue_ice=B,266,0
495 | conduit=B,412,0
496 | polished_granite_stairs=B,427,0
497 | smooth_red_sandstone_stairs=B,431,0
498 | mossy_stone_brick_stairs=B,430,0
499 | polished_diorite_stairs=B,428,0
500 | mossy_cobblestone_stairs=B,434,0
501 | end_stone_brick_stairs=B,433,0
502 | stone_stairs=B,435,0
503 | smooth_sandstone_stairs=B,432,0
504 | smooth_quartz_stairs=B,440,0
505 | granite_stairs=B,424,0
506 | andesite_stairs=B,426,0
507 | red_nether_brick_stairs=B,439,0
508 | polished_andesite_stairs=B,429,0
509 | diorite_stairs=B,425,0
510 | polished_granite_slab=B,417,7
511 | smooth_red_sandstone_slab=B,417,1
512 | mossy_stone_brick_slab=B,421,0
513 | polished_diorite_slab=B,417,5
514 | mossy_cobblestone_slab=B,182,5
515 | end_stone_brick_slab=B,417,0
516 | smooth_sandstone_slab=B,182,6
517 | smooth_quartz_slab=B,421,1
518 | granite_slab=B,417,6
519 | andesite_slab=B,417,3
520 | red_nether_brick_slab=B,182,7
521 | polished_andesite_slab=B,417,2
522 | diorite_slab=B,417,4
523 | scaffolding=B,420,0
524 | iron_door=I,330,0
525 | oak_door=I,324,0
526 | spruce_door=I,427,0
527 | birch_door=I,428,0
528 | jungle_door=I,429,0
529 | acacia_door=I,430,0
530 | dark_oak_door=I,431,0
531 | repeater=I,356,0
532 | comparator=I,404,0
533 | structure_block=B,252,0
534 | jigsaw=I,466,0
535 | composter=I,468,0
536 | turtle_helmet=I,469,~
537 | scute=I,468,~
538 | iron_shovel=I,256,~
539 | iron_pickaxe=I,257,~
540 | iron_axe=I,258,~
541 | flint_and_steel=I,259,~
542 | apple=I,260,~
543 | bow=I,261,~
544 | arrow=I,262,~
545 | coal=I,263,0
546 | charcoal=I,263,1
547 | diamond=I,264,~
548 | iron_ingot=I,265,~
549 | gold_ingot=I,266,~
550 | iron_sword=I,267,~
551 | wooden_sword=I,268,~
552 | wooden_shovel=I,269,~
553 | wooden_pickaxe=I,270,~
554 | wooden_axe=I,271,~
555 | stone_sword=I,272,~
556 | stone_shovel=I,273,~
557 | stone_pickaxe=I,274,~
558 | stone_axe=I,275,~
559 | diamond_sword=I,276,~
560 | diamond_shovel=I,277,~
561 | diamond_pickaxe=I,278,~
562 | diamond_axe=I,279,~
563 | stick=I,280,~
564 | bowl=I,281,~
565 | mushroom_stew=I,282,~
566 | golden_sword=I,283,~
567 | golden_shovel=I,284,~
568 | golden_pickaxe=I,285,~
569 | golden_axe=I,286,~
570 | string=I,287,~
571 | feather=I,288,~
572 | gunpowder=I,289,~
573 | wooden_hoe=I,290,~
574 | stone_hoe=I,291,~
575 | iron_hoe=I,292,~
576 | diamond_hoe=I,293,~
577 | golden_hoe=I,294,~
578 | wheat_seeds=I,295,~
579 | wheat=I,296,~
580 | bread=I,297,~
581 | leather_helmet=I,298,~
582 | leather_chestplate=I,299,~
583 | leather_leggings=I,300,~
584 | leather_boots=I,301,~
585 | chainmail_helmet=I,302,~
586 | chainmail_chestplate=I,303,~
587 | chainmail_leggings=I,304,~
588 | chainmail_boots=I,305,~
589 | iron_helmet=I,306,~
590 | iron_chestplate=I,307,~
591 | iron_leggings=I,308,~
592 | iron_boots=I,309,~
593 | diamond_helmet=I,310,~
594 | diamond_chestplate=I,311,~
595 | diamond_leggings=I,312,~
596 | diamond_boots=I,313,~
597 | golden_helmet=I,314,~
598 | golden_chestplate=I,315,~
599 | golden_leggings=I,316,~
600 | golden_boots=I,317,~
601 | flint=I,318,~
602 | porkchop=I,319,~
603 | cooked_porkchop=I,320,~
604 | painting=I,321,~
605 | golden_apple=I,322,~
606 | enchanted_golden_apple=I,466,~
607 | oak_sign=I,323,~
608 | spruce_sign=I,472,~
609 | birch_sign=I,473,~
610 | jungle_sign=I,474,~
611 | acacia_sign=I,475,~
612 | dark_oak_sign=I,476,~
613 | bucket=I,325,0
614 | water_bucket=I,325,8
615 | lava_bucket=I,325,10
616 | minecart=I,328,~
617 | saddle=I,329,~
618 | redstone=I,331,~
619 | snowball=I,332,~
620 | oak_boat=I,333,0
621 | leather=I,334,~
622 | milk_bucket=I,325,1
623 | pufferfish_bucket=I,325,5
624 | salmon_bucket=I,325,3
625 | cod_bucket=I,325,2
626 | tropical_fish_bucket=I,325,4
627 | brick=I,336,~
628 | clay_ball=I,337,~
629 | sugar_cane=I,338,~
630 | kelp=I,335,~
631 | dried_kelp_block=B,394,0
632 | bamboo=B,418,0
633 | paper=I,339,~
634 | book=I,340,~
635 | slime_ball=I,341,~
636 | chest_minecart=I,342,~
637 | furnace_minecart=B,0,0
638 | egg=I,344,~
639 | compass=I,345,~
640 | fishing_rod=I,346,~
641 | clock=I,347,~
642 | glowstone_dust=I,348,~
643 | cod=I,349,~
644 | salmon=I,460,~
645 | tropical_fish=I,461,~
646 | pufferfish=I,462,~
647 | cooked_cod=I,350,~
648 | cooked_salmon=I,463,~
649 | ink_sac=I,351,0
650 | red_dye=I,351,1
651 | green_dye=I,351,2
652 | cocoa_beans=I,351,3
653 | lapis_lazuli=I,351,4
654 | purple_dye=I,351,5
655 | cyan_dye=I,351,6
656 | light_gray_dye=I,351,7
657 | gray_dye=I,351,8
658 | pink_dye=I,351,9
659 | lime_dye=I,351,10
660 | yellow_dye=I,351,11
661 | light_blue_dye=I,351,12
662 | magenta_dye=I,351,13
663 | orange_dye=I,351,14
664 | bone_meal=I,351,15
665 | blue_dye=I,351,18
666 | brown_dye=I,351,17
667 | black_dye=I,351,16
668 | white_dye=I,351,19
669 | bone=I,352,~
670 | sugar=I,353,~
671 | cake=I,354,~
672 | white_bed=I,355,0
673 | orange_bed=I,355,1
674 | magenta_bed=I,355,2
675 | light_blue_bed=I,355,3
676 | yellow_bed=I,355,4
677 | lime_bed=I,355,5
678 | pink_bed=I,355,6
679 | gray_bed=I,355,7
680 | light_gray_bed=I,355,8
681 | cyan_bed=I,355,9
682 | purple_bed=I,355,10
683 | blue_bed=I,355,11
684 | brown_bed=I,355,12
685 | green_bed=I,355,13
686 | red_bed=I,355,14
687 | black_bed=I,355,15
688 | cookie=I,357,~
689 | filled_map=I,358,~
690 | shears=I,359,~
691 | melon_slice=I,360,~
692 | dried_kelp=I,464,~
693 | pumpkin_seeds=I,361,~
694 | melon_seeds=I,362,~
695 | beef=I,363,~
696 | cooked_beef=I,364,~
697 | chicken=I,365,~
698 | cooked_chicken=I,366,~
699 | rotten_flesh=I,367,~
700 | ender_pearl=I,368,~
701 | blaze_rod=I,369,~
702 | ghast_tear=I,370,~
703 | gold_nugget=I,371,~
704 | nether_wart=I,372,~
705 | potion=I,373,~
706 | glass_bottle=I,374,~
707 | spider_eye=I,375,~
708 | fermented_spider_eye=I,376,~
709 | blaze_powder=I,377,~
710 | magma_cream=I,378,~
711 | brewing_stand=I,379,~
712 | cauldron=I,380,~
713 | ender_eye=I,381,~
714 | glistering_melon_slice=I,382,~
715 | bat_spawn_egg=I,383,0
716 | blaze_spawn_egg=I,383,0
717 | cat_spawn_egg=I,383,0
718 | cave_spider_spawn_egg=I,383,0
719 | chicken_spawn_egg=I,383,0
720 | cod_spawn_egg=I,383,0
721 | cow_spawn_egg=I,383,0
722 | creeper_spawn_egg=I,383,0
723 | dolphin_spawn_egg=I,383,0
724 | donkey_spawn_egg=I,383,0
725 | drowned_spawn_egg=I,383,0
726 | elder_guardian_spawn_egg=I,383,0
727 | enderman_spawn_egg=I,383,0
728 | endermite_spawn_egg=I,383,0
729 | evoker_spawn_egg=I,383,0
730 | fox_spawn_egg=I,383,0
731 | ghast_spawn_egg=I,383,0
732 | guardian_spawn_egg=I,383,0
733 | horse_spawn_egg=I,383,0
734 | husk_spawn_egg=I,383,0
735 | llama_spawn_egg=I,383,0
736 | magma_cube_spawn_egg=I,383,0
737 | mooshroom_spawn_egg=I,383,0
738 | mule_spawn_egg=I,383,0
739 | ocelot_spawn_egg=I,383,0
740 | panda_spawn_egg=I,383,0
741 | parrot_spawn_egg=I,383,0
742 | phantom_spawn_egg=I,383,0
743 | pig_spawn_egg=I,383,0
744 | pillager_spawn_egg=I,383,0
745 | polar_bear_spawn_egg=I,383,0
746 | pufferfish_spawn_egg=I,383,0
747 | rabbit_spawn_egg=I,383,0
748 | ravager_spawn_egg=I,383,0
749 | salmon_spawn_egg=I,383,0
750 | sheep_spawn_egg=I,383,0
751 | shulker_spawn_egg=I,383,0
752 | silverfish_spawn_egg=I,383,0
753 | skeleton_spawn_egg=I,383,0
754 | skeleton_horse_spawn_egg=I,383,0
755 | slime_spawn_egg=I,383,0
756 | spider_spawn_egg=I,383,0
757 | squid_spawn_egg=I,383,0
758 | stray_spawn_egg=I,383,0
759 | trader_llama_spawn_egg=I,383,0
760 | tropical_fish_spawn_egg=I,383,0
761 | turtle_spawn_egg=I,383,0
762 | vex_spawn_egg=I,383,0
763 | villager_spawn_egg=I,383,0
764 | vindicator_spawn_egg=I,383,0
765 | wandering_trader_spawn_egg=I,383,0
766 | witch_spawn_egg=I,383,0
767 | wither_skeleton_spawn_egg=I,383,0
768 | wolf_spawn_egg=I,383,0
769 | zombie_spawn_egg=I,383,0
770 | zombie_horse_spawn_egg=I,383,0
771 | zombie_pigman_spawn_egg=I,383,0
772 | zombie_villager_spawn_egg=I,383,0
773 | bee_spawn_egg=I,383,0
774 | experience_bottle=I,384,~
775 | fire_charge=I,385,~
776 | writable_book=I,386,0
777 | written_book=I,387,0
778 | emerald=I,388,~
779 | item_frame=I,389,~
780 | flower_pot=I,390,~
781 | carrot=I,391,~
782 | potato=I,392,~
783 | baked_potato=I,393,~
784 | poisonous_potato=I,394,~
785 | map=I,395,~
786 | golden_carrot=I,396,~
787 | skeleton_skull=I,397,0
788 | wither_skeleton_skull=I,397,1
789 | player_head=I,397,3
790 | zombie_head=I,397,2
791 | creeper_head=I,397,4
792 | dragon_head=I,397,5
793 | carrot_on_a_stick=I,398,~
794 | nether_star=I,399,~
795 | pumpkin_pie=I,400,~
796 | firework_rocket=I,401,~
797 | firework_star=I,402,~
798 | enchanted_book=I,403,~
799 | nether_brick=I,405,~
800 | quartz=I,406,~
801 | tnt_minecart=I,407,~
802 | hopper_minecart=I,408,~
803 | prismarine_shard=I,409,~
804 | prismarine_crystals=I,422,~
805 | rabbit=I,411,~
806 | cooked_rabbit=I,412,~
807 | rabbit_stew=I,413,~
808 | rabbit_foot=I,414,~
809 | rabbit_hide=I,415,~
810 | armor_stand=I,425,~
811 | iron_horse_armor=I,417,~
812 | golden_horse_armor=I,418,~
813 | diamond_horse_armor=I,419,~
814 | leather_horse_armor=I,416,~
815 | lead=I,420,~
816 | name_tag=I,421,~
817 | command_block_minecart=I,443,0
818 | mutton=I,423,~
819 | cooked_mutton=I,424,~
820 | white_banner=I,425,0
821 | orange_banner=I,425,1
822 | magenta_banner=I,425,2
823 | light_blue_banner=I,425,3
824 | yellow_banner=I,425,4
825 | lime_banner=I,425,5
826 | pink_banner=I,425,6
827 | gray_banner=I,425,7
828 | light_gray_banner=I,425,8
829 | cyan_banner=I,425,9
830 | purple_banner=I,425,10
831 | blue_banner=I,425,11
832 | brown_banner=I,425,12
833 | green_banner=I,425,13
834 | red_banner=I,425,14
835 | black_banner=I,425,15
836 | end_crystal=I,426,~
837 | chorus_fruit=I,432,~
838 | popped_chorus_fruit=I,433,~
839 | beetroot=I,457,~
840 | beetroot_seeds=I,458,~
841 | beetroot_soup=I,459,~
842 | dragon_breath=I,437,~
843 | splash_potion=I,438,0
844 | spectral_arrow=I,262,0
845 | tipped_arrow=I,262,0
846 | lingering_potion=I,441,0
847 | shield=I,513,~
848 | elytra=I,444,~
849 | spruce_boat=I,333,1
850 | birch_boat=I,333,2
851 | jungle_boat=I,333,3
852 | acacia_boat=I,333,4
853 | dark_oak_boat=I,333,5
854 | totem_of_undying=I,450,~
855 | shulker_shell=I,445,~
856 | iron_nugget=I,452,~
857 | # Missing
858 | knowledge_book=B,0,0
859 | # Missing
860 | debug_stick=B,0,0
861 | music_disc_13=I,500,~
862 | music_disc_cat=I,501,~
863 | music_disc_blocks=I,502,~
864 | music_disc_chirp=I,503,~
865 | music_disc_far=I,504,~
866 | music_disc_mall=I,505,~
867 | music_disc_mellohi=I,506,~
868 | music_disc_stal=I,507,~
869 | music_disc_strad=I,508,~
870 | music_disc_ward=I,509,~
871 | music_disc_11=I,510,~
872 | music_disc_wait=I,511,~
873 | trident=I,455,~
874 | phantom_membrane=I,470,~
875 | nautilus_shell=I,465,~
876 | heart_of_the_sea=I,467,~
877 | crossbow=I,471,~
878 | suspicious_stew=I,282,0
879 | loom=B,459,0
880 | flower_banner_pattern=I,434,2
881 | creeper_banner_pattern=I,434,0
882 | skull_banner_pattern=I,434,1
883 | mojang_banner_pattern=I,434,3
884 | # Missing
885 | globe_banner_pattern=I,434,4
886 | barrel=B,458,0
887 | smoker=B,453,0
888 | blast_furnace=B,451,0
889 | cartography_table=B,455,0
890 | fletching_table=B,456,0
891 | grindstone=B,450,0
892 | lectern=B,449,0
893 | smithing_table=B,457,0
894 | stonecutter=B,245,0
895 | bell=B,261,0
896 | lantern=B,463,0
897 | sweet_berries=I,477,0
898 | campfire=B,464,0
899 | honeycomb=I,736,~
900 | bee_nest=B,473,0
901 | beehive=B,474,0
902 | honey_bottle=I,737,~
903 | honey_block=B,475,0
904 | honeycomb_block=B,476,0
905 |
--------------------------------------------------------------------------------
/src/main/resources/java-entities.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | # Generated on Minecraft 1.14 at 2019-05-22 22:25:31 BRT
3 | #Missing
4 | area_effect_cloud=
5 | #Missing
6 | armor_stand=
7 | arrow=Arrow
8 | bat=Bat
9 | blaze=Blaze
10 | boat=Boat
11 | cat=Cat
12 | cave_spider=CaveSpider
13 | chicken=Chicken
14 | cod=Cod
15 | cow=Cow
16 | creeper=Creeper
17 | donkey=Donkey
18 | dolphin=Dolphin
19 | #Missing
20 | dragon_fireball=
21 | drowned=Drowned
22 | elder_guardian=ElderGuardian
23 | end_crystal=EndCrystal
24 | ender_dragon=EnderDragon
25 | enderman=Enderman
26 | endermite=Endermite
27 | evoker_fangs=
28 | evoker=Evoker
29 | experience_orb=XpOrb
30 | #Missing
31 | eye_of_ender=
32 | falling_block=FallingSand
33 | firework_rocket=Firework
34 | #Missing
35 | fox=
36 | ghast=Ghast
37 | #Missing
38 | giant=
39 | guardian=Guardian
40 | horse=Horse
41 | husk=Husk
42 | #Missing
43 | illusioner=
44 | item=Item
45 | #Not an entity
46 | item_frame=
47 | #Missing
48 | fireball=
49 | #Missing
50 | leash_knot=
51 | llama=Llama
52 | #Missing
53 | llama_spit=
54 | magma_cube=MagmaCube
55 | minecart=MinecartRideable
56 | chest_minecart=MinecartChest
57 | #Missing
58 | command_block_minecart=
59 | #Missing
60 | furnace_minecart=
61 | hopper_minecart=MinecartHopper
62 | #Missing
63 | spawner_minecart=
64 | tnt_minecart=MinecartTnt
65 | mule=Mule
66 | mooshroom=Mooshroom
67 | ocelot=Ocelot
68 | painting=Painting
69 | panda=Panda
70 | parrot=Parrot
71 | pig=Pig
72 | pufferfish=Pufferfish
73 | zombie_pigman=ZombiePigman
74 | polar_bear=PolarBear
75 | tnt=PrimedTnt
76 | rabbit=Rabbit
77 | salmon=Salmon
78 | sheep=Sheep
79 | shulker=Shulker
80 | #Missing
81 | shulker_bullet=
82 | silverfish=Silverfish
83 | skeleton=Skeleton
84 | skeleton_horse=SkeletonHorse
85 | slime=Slime
86 | #Missing
87 | small_fireball=
88 | #Missing
89 | snow_golem=
90 | snowball=Snowball
91 | #Missing
92 | spectral_arrow=
93 | spider=Spider
94 | squid=Squid
95 | stray=Stray
96 | #Missing
97 | trader_llama=
98 | tropical_fish=TropicalFish
99 | turtle=Turtle
100 | egg=Egg
101 | ender_pearl=EnderPearl
102 | experience_bottle=ThrownExpBottle
103 | potion=ThrownPotion
104 | trident=ThrownTrident
105 | vex=Vex
106 | villager=VillagerV1
107 | #Missing
108 | iron_golem=
109 | vindicator=Vindicator
110 | pillager=Pillager
111 | wandering_trader=WanderingTrader
112 | witch=Witch
113 | wither=Wither
114 | wither_skeleton=WitherSkeleton
115 | #Missing
116 | wither_skull=
117 | wolf=Wolf
118 | zombie=Zombie
119 | zombie_horse=ZombieHorse
120 | zombie_villager=ZombieVillagerV1
121 | phantom=Phantom
122 | ravager=Ravager
123 | #Missing
124 | lightning_bolt=
125 | player=Human
126 | fishing_bobber=FishingHook
127 |
--------------------------------------------------------------------------------
/src/main/resources/java-inherited-waterlogging.txt:
--------------------------------------------------------------------------------
1 | minecraft:bubble_column
2 | minecraft:kelp
3 | minecraft:kelp_plant
4 | minecraft:seagrass
5 | minecraft:tall_seagrass
6 |
--------------------------------------------------------------------------------
/src/main/resources/nukkit-block-ids.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | AIR=0
3 | STONE=1
4 | GRASS=2
5 | DIRT=3
6 | COBBLESTONE=4
7 | COBBLE=4
8 | PLANK=5
9 | PLANKS=5
10 | WOODEN_PLANK=5
11 | WOODEN_PLANKS=5
12 | SAPLING=6
13 | SAPLINGS=6
14 | BEDROCK=7
15 | WATER=8
16 | STILL_WATER=9
17 | LAVA=10
18 | STILL_LAVA=11
19 | SAND=12
20 | GRAVEL=13
21 | GOLD_ORE=14
22 | IRON_ORE=15
23 | COAL_ORE=16
24 | LOG=17
25 | WOOD=17
26 | TRUNK=17
27 | LEAVES=18
28 | LEAVE=18
29 | SPONGE=19
30 | GLASS=20
31 | LAPIS_ORE=21
32 | LAPIS_BLOCK=22
33 | DISPENSER=23
34 | SANDSTONE=24
35 | NOTEBLOCK=25
36 | BED_BLOCK=26
37 | POWERED_RAIL=27
38 | DETECTOR_RAIL=28
39 | STICKY_PISTON=29
40 | COBWEB=30
41 | TALL_GRASS=31
42 | BUSH=32
43 | DEAD_BUSH=32
44 | PISTON=33
45 | PISTON_HEAD=34
46 | WOOL=35
47 | DANDELION=37
48 | POPPY=38
49 | ROSE=38
50 | FLOWER=38
51 | RED_FLOWER=38
52 | BROWN_MUSHROOM=39
53 | RED_MUSHROOM=40
54 | GOLD_BLOCK=41
55 | IRON_BLOCK=42
56 | DOUBLE_SLAB=43
57 | DOUBLE_STONE_SLAB=43
58 | DOUBLE_SLABS=43
59 | SLAB=44
60 | STONE_SLAB=44
61 | SLABS=44
62 | BRICKS=45
63 | BRICKS_BLOCK=45
64 | TNT=46
65 | BOOKSHELF=47
66 | MOSS_STONE=48
67 | MOSSY_STONE=48
68 | OBSIDIAN=49
69 | TORCH=50
70 | FIRE=51
71 | MONSTER_SPAWNER=52
72 | WOOD_STAIRS=53
73 | WOODEN_STAIRS=53
74 | OAK_WOOD_STAIRS=53
75 | OAK_WOODEN_STAIRS=53
76 | CHEST=54
77 | REDSTONE_WIRE=55
78 | DIAMOND_ORE=56
79 | DIAMOND_BLOCK=57
80 | CRAFTING_TABLE=58
81 | WORKBENCH=58
82 | WHEAT_BLOCK=59
83 | FARMLAND=60
84 | FURNACE=61
85 | BURNING_FURNACE=62
86 | LIT_FURNACE=62
87 | SIGN_POST=63
88 | DOOR_BLOCK=64
89 | WOODEN_DOOR_BLOCK=64
90 | WOOD_DOOR_BLOCK=64
91 | LADDER=65
92 | RAIL=66
93 | COBBLE_STAIRS=67
94 | COBBLESTONE_STAIRS=67
95 | WALL_SIGN=68
96 | LEVER=69
97 | STONE_PRESSURE_PLATE=70
98 | IRON_DOOR_BLOCK=71
99 | WOODEN_PRESSURE_PLATE=72
100 | REDSTONE_ORE=73
101 | GLOWING_REDSTONE_ORE=74
102 | LIT_REDSTONE_ORE=74
103 | UNLIT_REDSTONE_TORCH=75
104 | REDSTONE_TORCH=76
105 | STONE_BUTTON=77
106 | SNOW=78
107 | SNOW_LAYER=78
108 | ICE=79
109 | SNOW_BLOCK=80
110 | CACTUS=81
111 | CLAY_BLOCK=82
112 | REEDS=83
113 | SUGARCANE_BLOCK=83
114 | JUKEBOX=84
115 | FENCE=85
116 | PUMPKIN=86
117 | NETHERRACK=87
118 | SOUL_SAND=88
119 | GLOWSTONE=89
120 | GLOWSTONE_BLOCK=89
121 | NETHER_PORTAL=90
122 | LIT_PUMPKIN=91
123 | JACK_O_LANTERN=91
124 | CAKE_BLOCK=92
125 | UNPOWERED_REPEATER=93
126 | POWERED_REPEATER=94
127 | INVISIBLE_BEDROCK=95
128 | TRAPDOOR=96
129 | MONSTER_EGG=97
130 | STONE_BRICKS=98
131 | STONE_BRICK=98
132 | BROWN_MUSHROOM_BLOCK=99
133 | RED_MUSHROOM_BLOCK=100
134 | IRON_BAR=101
135 | IRON_BARS=101
136 | GLASS_PANE=102
137 | GLASS_PANEL=102
138 | MELON_BLOCK=103
139 | PUMPKIN_STEM=104
140 | MELON_STEM=105
141 | VINE=106
142 | VINES=106
143 | FENCE_GATE=107
144 | FENCE_GATE_OAK=107
145 | BRICK_STAIRS=108
146 | STONE_BRICK_STAIRS=109
147 | MYCELIUM=110
148 | WATER_LILY=111
149 | LILY_PAD=111
150 | NETHER_BRICKS=112
151 | NETHER_BRICK_BLOCK=112
152 | NETHER_BRICK_FENCE=113
153 | NETHER_BRICKS_STAIRS=114
154 | NETHER_WART_BLOCK=115
155 | ENCHANTING_TABLE=116
156 | ENCHANT_TABLE=116
157 | ENCHANTMENT_TABLE=116
158 | BREWING_STAND_BLOCK=117
159 | BREWING_BLOCK=117
160 | CAULDRON_BLOCK=118
161 | END_PORTAL=119
162 | END_PORTAL_FRAME=120
163 | END_STONE=121
164 | DRAGON_EGG=122
165 | REDSTONE_LAMP=123
166 | LIT_REDSTONE_LAMP=124
167 | DROPPER=125
168 | ACTIVATOR_RAIL=126
169 | COCOA=127
170 | COCOA_BLOCK=127
171 | SANDSTONE_STAIRS=128
172 | EMERALD_ORE=129
173 | ENDER_CHEST=130
174 | TRIPWIRE_HOOK=131
175 | TRIPWIRE=132
176 | EMERALD_BLOCK=133
177 | SPRUCE_WOOD_STAIRS=134
178 | SPRUCE_WOODEN_STAIRS=134
179 | BIRCH_WOOD_STAIRS=135
180 | BIRCH_WOODEN_STAIRS=135
181 | JUNGLE_WOOD_STAIRS=136
182 | JUNGLE_WOODEN_STAIRS=136
183 | BEACON=138
184 | COBBLE_WALL=139
185 | STONE_WALL=139
186 | COBBLESTONE_WALL=139
187 | FLOWER_POT_BLOCK=140
188 | CARROT_BLOCK=141
189 | POTATO_BLOCK=142
190 | WOODEN_BUTTON=143
191 | SKULL_BLOCK=144
192 | ANVIL=145
193 | TRAPPED_CHEST=146
194 | LIGHT_WEIGHTED_PRESSURE_PLATE=147
195 | HEAVY_WEIGHTED_PRESSURE_PLATE=148
196 | UNPOWERED_COMPARATOR=149
197 | POWERED_COMPARATOR=150
198 | DAYLIGHT_DETECTOR=151
199 | REDSTONE_BLOCK=152
200 | QUARTZ_ORE=153
201 | HOPPER_BLOCK=154
202 | QUARTZ_BLOCK=155
203 | QUARTZ_STAIRS=156
204 | DOUBLE_WOOD_SLAB=157
205 | DOUBLE_WOODEN_SLAB=157
206 | DOUBLE_WOOD_SLABS=157
207 | DOUBLE_WOODEN_SLABS=157
208 | WOOD_SLAB=158
209 | WOODEN_SLAB=158
210 | WOOD_SLABS=158
211 | WOODEN_SLABS=158
212 | STAINED_TERRACOTTA=159
213 | STAINED_HARDENED_CLAY=159
214 | STAINED_GLASS_PANE=160
215 | LEAVES2=161
216 | LEAVE2=161
217 | WOOD2=162
218 | TRUNK2=162
219 | LOG2=162
220 | ACACIA_WOOD_STAIRS=163
221 | ACACIA_WOODEN_STAIRS=163
222 | DARK_OAK_WOOD_STAIRS=164
223 | DARK_OAK_WOODEN_STAIRS=164
224 | SLIME_BLOCK=165
225 | IRON_TRAPDOOR=167
226 | PRISMARINE=168
227 | SEA_LANTERN=169
228 | HAY_BALE=170
229 | CARPET=171
230 | TERRACOTTA=172
231 | COAL_BLOCK=173
232 | PACKED_ICE=174
233 | DOUBLE_PLANT=175
234 | STANDING_BANNER=176
235 | WALL_BANNER=177
236 | DAYLIGHT_DETECTOR_INVERTED=178
237 | RED_SANDSTONE=179
238 | RED_SANDSTONE_STAIRS=180
239 | DOUBLE_RED_SANDSTONE_SLAB=181
240 | RED_SANDSTONE_SLAB=182
241 | FENCE_GATE_SPRUCE=183
242 | FENCE_GATE_BIRCH=184
243 | FENCE_GATE_JUNGLE=185
244 | FENCE_GATE_DARK_OAK=186
245 | FENCE_GATE_ACACIA=187
246 | SPRUCE_DOOR_BLOCK=193
247 | BIRCH_DOOR_BLOCK=194
248 | JUNGLE_DOOR_BLOCK=195
249 | ACACIA_DOOR_BLOCK=196
250 | DARK_OAK_DOOR_BLOCK=197
251 | GRASS_PATH=198
252 | ITEM_FRAME_BLOCK=199
253 | CHORUS_FLOWER=200
254 | PURPUR_BLOCK=201
255 | PURPUR_STAIRS=203
256 | UNDYED_SHULKER_BOX=205
257 | END_BRICKS=206
258 | ICE_FROSTED=207
259 | END_ROD=208
260 | END_GATEWAY=209
261 | MAGMA=213
262 | BLOCK_NETHER_WART_BLOCK=214
263 | RED_NETHER_BRICK=215
264 | BONE_BLOCK=216
265 | SHULKER_BOX=218
266 | PURPLE_GLAZED_TERRACOTTA=219
267 | WHITE_GLAZED_TERRACOTTA=220
268 | ORANGE_GLAZED_TERRACOTTA=221
269 | MAGENTA_GLAZED_TERRACOTTA=222
270 | LIGHT_BLUE_GLAZED_TERRACOTTA=223
271 | YELLOW_GLAZED_TERRACOTTA=224
272 | LIME_GLAZED_TERRACOTTA=225
273 | PINK_GLAZED_TERRACOTTA=226
274 | GRAY_GLAZED_TERRACOTTA=227
275 | SILVER_GLAZED_TERRACOTTA=228
276 | CYAN_GLAZED_TERRACOTTA=229
277 | BLUE_GLAZED_TERRACOTTA=231
278 | BROWN_GLAZED_TERRACOTTA=232
279 | GREEN_GLAZED_TERRACOTTA=233
280 | RED_GLAZED_TERRACOTTA=234
281 | BLACK_GLAZED_TERRACOTTA=235
282 | CONCRETE=236
283 | CONCRETE_POWDER=237
284 | CHORUS_PLANT=240
285 | STAINED_GLASS=241
286 | PODZOL=243
287 | BEETROOT_BLOCK=244
288 | STONECUTTER=245
289 | GLOWING_OBSIDIAN=246
290 | NETHER_REACTOR=247
291 | PISTON_EXTENSION=250
292 | OBSERVER=251
293 |
--------------------------------------------------------------------------------
/src/main/resources/nukkit-item-ids.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | IRON_SHOVEL=256
3 | IRON_PICKAXE=257
4 | IRON_AXE=258
5 | FLINT_STEEL=259
6 | FLINT_AND_STEEL=259
7 | APPLE=260
8 | BOW=261
9 | ARROW=262
10 | COAL=263
11 | DIAMOND=264
12 | IRON_INGOT=265
13 | GOLD_INGOT=266
14 | IRON_SWORD=267
15 | WOODEN_SWORD=268
16 | WOODEN_SHOVEL=269
17 | WOODEN_PICKAXE=270
18 | WOODEN_AXE=271
19 | STONE_SWORD=272
20 | STONE_SHOVEL=273
21 | STONE_PICKAXE=274
22 | STONE_AXE=275
23 | DIAMOND_SWORD=276
24 | DIAMOND_SHOVEL=277
25 | DIAMOND_PICKAXE=278
26 | DIAMOND_AXE=279
27 | STICK=280
28 | STICKS=280
29 | BOWL=281
30 | MUSHROOM_STEW=282
31 | GOLD_SWORD=283
32 | GOLDEN_SWORD=283
33 | GOLD_SHOVEL=284
34 | GOLDEN_SHOVEL=284
35 | GOLD_PICKAXE=285
36 | GOLDEN_PICKAXE=285
37 | GOLD_AXE=286
38 | GOLDEN_AXE=286
39 | STRING=287
40 | FEATHER=288
41 | GUNPOWDER=289
42 | WOODEN_HOE=290
43 | STONE_HOE=291
44 | IRON_HOE=292
45 | DIAMOND_HOE=293
46 | GOLD_HOE=294
47 | GOLDEN_HOE=294
48 | SEEDS=295
49 | WHEAT_SEEDS=295
50 | WHEAT=296
51 | BREAD=297
52 | LEATHER_CAP=298
53 | LEATHER_TUNIC=299
54 | LEATHER_PANTS=300
55 | LEATHER_BOOTS=301
56 | CHAIN_HELMET=302
57 | CHAIN_CHESTPLATE=303
58 | CHAIN_LEGGINGS=304
59 | CHAIN_BOOTS=305
60 | IRON_HELMET=306
61 | IRON_CHESTPLATE=307
62 | IRON_LEGGINGS=308
63 | IRON_BOOTS=309
64 | DIAMOND_HELMET=310
65 | DIAMOND_CHESTPLATE=311
66 | DIAMOND_LEGGINGS=312
67 | DIAMOND_BOOTS=313
68 | GOLD_HELMET=314
69 | GOLD_CHESTPLATE=315
70 | GOLD_LEGGINGS=316
71 | GOLD_BOOTS=317
72 | FLINT=318
73 | RAW_PORKCHOP=319
74 | COOKED_PORKCHOP=320
75 | PAINTING=321
76 | GOLDEN_APPLE=322
77 | SIGN=323
78 | WOODEN_DOOR=324
79 | BUCKET=325
80 | MINECART=328
81 | SADDLE=329
82 | IRON_DOOR=330
83 | REDSTONE=331
84 | REDSTONE_DUST=331
85 | SNOWBALL=332
86 | BOAT=333
87 | LEATHER=334
88 | KELP=335
89 | BRICK=336
90 | CLAY=337
91 | SUGARCANE=338
92 | SUGAR_CANE=338
93 | SUGAR_CANES=338
94 | PAPER=339
95 | BOOK=340
96 | SLIMEBALL=341
97 | MINECART_WITH_CHEST=342
98 | EGG=344
99 | COMPASS=345
100 | FISHING_ROD=346
101 | CLOCK=347
102 | GLOWSTONE_DUST=348
103 | RAW_FISH=349
104 | COOKED_FISH=350
105 | DYE=351
106 | BONE=352
107 | SUGAR=353
108 | CAKE=354
109 | BED=355
110 | REPEATER=356
111 | COOKIE=357
112 | MAP=358
113 | SHEARS=359
114 | MELON=360
115 | MELON_SLICE=360
116 | PUMPKIN_SEEDS=361
117 | MELON_SEEDS=362
118 | RAW_BEEF=363
119 | STEAK=364
120 | COOKED_BEEF=364
121 | RAW_CHICKEN=365
122 | COOKED_CHICKEN=366
123 | ROTTEN_FLESH=367
124 | ENDER_PEARL=368
125 | BLAZE_ROD=369
126 | GHAST_TEAR=370
127 | GOLD_NUGGET=371
128 | GOLDEN_NUGGET=371
129 | NETHER_WART=372
130 | POTION=373
131 | GLASS_BOTTLE=374
132 | BOTTLE=374
133 | SPIDER_EYE=375
134 | FERMENTED_SPIDER_EYE=376
135 | BLAZE_POWDER=377
136 | MAGMA_CREAM=378
137 | BREWING_STAND=379
138 | BREWING=379
139 | CAULDRON=380
140 | ENDER_EYE=381
141 | GLISTERING_MELON=382
142 | SPAWN_EGG=383
143 | EXPERIENCE_BOTTLE=384
144 | FIRE_CHARGE=385
145 | BOOK_AND_QUILL=386
146 | WRITTEN_BOOK=387
147 | EMERALD=388
148 | ITEM_FRAME=389
149 | FLOWER_POT=390
150 | CARROT=391
151 | CARROTS=391
152 | POTATO=392
153 | POTATOES=392
154 | BAKED_POTATO=393
155 | BAKED_POTATOES=393
156 | POISONOUS_POTATO=394
157 | EMPTY_MAP=395
158 | GOLDEN_CARROT=396
159 | SKULL=397
160 | CARROT_ON_A_STICK=398
161 | NETHER_STAR=399
162 | PUMPKIN_PIE=400
163 | FIREWORKS=401
164 | FIREWORKSCHARGE=402
165 | ENCHANTED_BOOK=403
166 | ENCHANT_BOOK=403
167 | COMPARATOR=404
168 | NETHER_BRICK=405
169 | QUARTZ=406
170 | NETHER_QUARTZ=406
171 | MINECART_WITH_TNT=407
172 | MINECART_WITH_HOPPER=408
173 | PRISMARINE_SHARD=409
174 | HOPPER=410
175 | RAW_RABBIT=411
176 | COOKED_RABBIT=412
177 | RABBIT_STEW=413
178 | RABBIT_FOOT=414
179 | RABBIT_HIDE=415
180 | LEATHER_HORSE_ARMOR=416
181 | IRON_HORSE_ARMOR=417
182 | GOLD_HORSE_ARMOR=418
183 | DIAMOND_HORSE_ARMOR=419
184 | LEAD=420
185 | NAME_TAG=421
186 | PRISMARINE_CRYSTALS=422
187 | RAW_MUTTON=423
188 | COOKED_MUTTON=424
189 | ARMOR_STAND=425
190 | END_CRYSTAL=426
191 | SPRUCE_DOOR=427
192 | BIRCH_DOOR=428
193 | JUNGLE_DOOR=429
194 | ACACIA_DOOR=430
195 | DARK_OAK_DOOR=431
196 | CHORUS_FRUIT=432
197 | POPPED_CHORUS_FRUIT=433
198 | DRAGON_BREATH=437
199 | SPLASH_POTION=438
200 | LINGERING_POTION=441
201 | COMMAND_BLOCK_MINECART=443
202 | ELYTRA=444
203 | SHULKER_SHELL=445
204 | BANNER=446
205 | TOTEM=450
206 | IRON_NUGGET=452
207 | TRIDENT=455
208 | BEETROOT=457
209 | BEETROOT_SEEDS=458
210 | BEETROOT_SEED=458
211 | BEETROOT_SOUP=459
212 | RAW_SALMON=460
213 | CLOWNFISH=461
214 | PUFFERFISH=462
215 | COOKED_SALMON=463
216 | DRIED_KELP=464
217 | NAUTILUS_SHELL=465
218 | GOLDEN_APPLE_ENCHANTED=466
219 | HEART_OF_THE_SEA=467
220 | SCUTE=468
221 | TURTLE_SHELL=469
222 | PHANTOM_MEMBRANE=470
223 | SWEET_BERRIES=477
224 | RECORD_13=500
225 | RECORD_CAT=501
226 | RECORD_BLOCKS=502
227 | RECORD_CHIRP=503
228 | RECORD_FAR=504
229 | RECORD_MALL=505
230 | RECORD_MELLOHI=506
231 | RECORD_STAL=507
232 | RECORD_STRAD=508
233 | RECORD_WARD=509
234 | RECORD_11=510
235 | RECORD_WAIT=511
236 | SHIELD=513
237 |
--------------------------------------------------------------------------------
/src/main/resources/paintings.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | kebab=Kebab,1,1
3 | aztec=Aztec,1,1
4 | alban=Alban,1,1
5 | aztec2=Aztec2,1,1
6 | bomb=Bomb,1,1
7 | plant=Plant,1,1
8 | wasteland=Wasteland,1,1
9 | pool=Pool,2,1
10 | courbet=Courbet,2,1
11 | sea=Sea,2,1
12 | sunset=Sunset,2,1
13 | creebet=Creebet,2,1
14 | wanderer=Wanderer,1,2
15 | graham=Graham,1,2
16 | match=Match,2,2
17 | bust=Bust,2,2
18 | stage=Stage,2,2
19 | void=Void,2,2
20 | skull_and_roses=SkullAndRoses,2,2
21 | wither=Wither,2,2
22 | fighters=Fighters,4,2
23 | pointer=Pointer,4,4
24 | pigscene=Pigscene,4,4
25 | burning_skull=Flaming Skull,4,4
26 | skeleton=Skeleton,4,3
27 | donkey_kong=DonkeyKong,4,3
28 |
--------------------------------------------------------------------------------
/src/main/resources/potions.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | empty=0
3 | water=0
4 | mundane=1
5 | thick=3
6 | awkward=4
7 | night_vision=5
8 | long_night_vision=6
9 | invisibility=7
10 | long_invisibility=8
11 | leaping=9
12 | strong_leaping=11
13 | long_leaping=10
14 | fire_resistance=12
15 | long_fire_resistance=13
16 | swiftness=14
17 | strong_swiftness=16
18 | long_swiftness=15
19 | slowness=17
20 | strong_slowness=17
21 | long_slowness=18
22 | water_breathing=19
23 | long_water_breathing=20
24 | healing=21
25 | strong_healing=22
26 | harming=23
27 | strong_harming=24
28 | poison=25
29 | strong_poison=27
30 | long_poison=26
31 | regeneration=28
32 | strong_regeneration=30
33 | long_regeneration=29
34 | strength=31
35 | strong_strength=33
36 | long_strength=32
37 | weakness=34
38 | long_weakness=35
39 | luck=0
40 | turtle_master=37
41 | strong_turtle_master=39
42 | long_turtle_master=38
43 | slow_falling=40
44 | long_slow_falling=41
45 |
--------------------------------------------------------------------------------
/src/main/resources/powernukkit-block-ids.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | AIR=0
3 | STONE=1
4 | GRASS=2
5 | DIRT=3
6 | COBBLESTONE=4
7 | COBBLE=4
8 | PLANK=5
9 | PLANKS=5
10 | WOODEN_PLANK=5
11 | WOODEN_PLANKS=5
12 | SAPLING=6
13 | SAPLINGS=6
14 | BEDROCK=7
15 | WATER=8
16 | STILL_WATER=9
17 | LAVA=10
18 | STILL_LAVA=11
19 | SAND=12
20 | GRAVEL=13
21 | GOLD_ORE=14
22 | IRON_ORE=15
23 | COAL_ORE=16
24 | LOG=17
25 | WOOD=17
26 | TRUNK=17
27 | LEAVES=18
28 | LEAVE=18
29 | SPONGE=19
30 | GLASS=20
31 | LAPIS_ORE=21
32 | LAPIS_BLOCK=22
33 | DISPENSER=23
34 | SANDSTONE=24
35 | NOTEBLOCK=25
36 | BED_BLOCK=26
37 | POWERED_RAIL=27
38 | DETECTOR_RAIL=28
39 | STICKY_PISTON=29
40 | COBWEB=30
41 | TALL_GRASS=31
42 | BUSH=32
43 | DEAD_BUSH=32
44 | PISTON=33
45 | PISTON_HEAD=34
46 | WOOL=35
47 | DANDELION=37
48 | POPPY=38
49 | ROSE=38
50 | FLOWER=38
51 | RED_FLOWER=38
52 | BROWN_MUSHROOM=39
53 | RED_MUSHROOM=40
54 | GOLD_BLOCK=41
55 | IRON_BLOCK=42
56 | DOUBLE_SLAB=43
57 | DOUBLE_STONE_SLAB=43
58 | DOUBLE_SLABS=43
59 | SLAB=44
60 | STONE_SLAB=44
61 | SLABS=44
62 | BRICKS=45
63 | BRICKS_BLOCK=45
64 | TNT=46
65 | BOOKSHELF=47
66 | MOSS_STONE=48
67 | MOSSY_STONE=48
68 | OBSIDIAN=49
69 | TORCH=50
70 | FIRE=51
71 | MONSTER_SPAWNER=52
72 | WOOD_STAIRS=53
73 | WOODEN_STAIRS=53
74 | OAK_WOOD_STAIRS=53
75 | OAK_WOODEN_STAIRS=53
76 | CHEST=54
77 | REDSTONE_WIRE=55
78 | DIAMOND_ORE=56
79 | DIAMOND_BLOCK=57
80 | CRAFTING_TABLE=58
81 | WORKBENCH=58
82 | WHEAT_BLOCK=59
83 | FARMLAND=60
84 | FURNACE=61
85 | BURNING_FURNACE=62
86 | LIT_FURNACE=62
87 | SIGN_POST=63
88 | DOOR_BLOCK=64
89 | WOODEN_DOOR_BLOCK=64
90 | WOOD_DOOR_BLOCK=64
91 | LADDER=65
92 | RAIL=66
93 | COBBLE_STAIRS=67
94 | COBBLESTONE_STAIRS=67
95 | WALL_SIGN=68
96 | LEVER=69
97 | STONE_PRESSURE_PLATE=70
98 | IRON_DOOR_BLOCK=71
99 | WOODEN_PRESSURE_PLATE=72
100 | REDSTONE_ORE=73
101 | GLOWING_REDSTONE_ORE=74
102 | LIT_REDSTONE_ORE=74
103 | UNLIT_REDSTONE_TORCH=75
104 | REDSTONE_TORCH=76
105 | STONE_BUTTON=77
106 | SNOW=78
107 | SNOW_LAYER=78
108 | ICE=79
109 | SNOW_BLOCK=80
110 | CACTUS=81
111 | CLAY_BLOCK=82
112 | REEDS=83
113 | SUGARCANE_BLOCK=83
114 | JUKEBOX=84
115 | FENCE=85
116 | PUMPKIN=86
117 | NETHERRACK=87
118 | SOUL_SAND=88
119 | GLOWSTONE=89
120 | GLOWSTONE_BLOCK=89
121 | NETHER_PORTAL=90
122 | LIT_PUMPKIN=91
123 | JACK_O_LANTERN=91
124 | CAKE_BLOCK=92
125 | UNPOWERED_REPEATER=93
126 | POWERED_REPEATER=94
127 | INVISIBLE_BEDROCK=95
128 | TRAPDOOR=96
129 | MONSTER_EGG=97
130 | STONE_BRICKS=98
131 | STONE_BRICK=98
132 | BROWN_MUSHROOM_BLOCK=99
133 | RED_MUSHROOM_BLOCK=100
134 | IRON_BAR=101
135 | IRON_BARS=101
136 | GLASS_PANE=102
137 | GLASS_PANEL=102
138 | MELON_BLOCK=103
139 | PUMPKIN_STEM=104
140 | MELON_STEM=105
141 | VINE=106
142 | VINES=106
143 | FENCE_GATE=107
144 | FENCE_GATE_OAK=107
145 | BRICK_STAIRS=108
146 | STONE_BRICK_STAIRS=109
147 | MYCELIUM=110
148 | WATER_LILY=111
149 | LILY_PAD=111
150 | NETHER_BRICKS=112
151 | NETHER_BRICK_BLOCK=112
152 | NETHER_BRICK_FENCE=113
153 | NETHER_BRICKS_STAIRS=114
154 | NETHER_WART_BLOCK=115
155 | ENCHANTING_TABLE=116
156 | ENCHANT_TABLE=116
157 | ENCHANTMENT_TABLE=116
158 | BREWING_STAND_BLOCK=117
159 | BREWING_BLOCK=117
160 | CAULDRON_BLOCK=118
161 | END_PORTAL=119
162 | END_PORTAL_FRAME=120
163 | END_STONE=121
164 | DRAGON_EGG=122
165 | REDSTONE_LAMP=123
166 | LIT_REDSTONE_LAMP=124
167 | DROPPER=125
168 | ACTIVATOR_RAIL=126
169 | COCOA=127
170 | COCOA_BLOCK=127
171 | SANDSTONE_STAIRS=128
172 | EMERALD_ORE=129
173 | ENDER_CHEST=130
174 | TRIPWIRE_HOOK=131
175 | TRIPWIRE=132
176 | EMERALD_BLOCK=133
177 | SPRUCE_WOOD_STAIRS=134
178 | SPRUCE_WOODEN_STAIRS=134
179 | BIRCH_WOOD_STAIRS=135
180 | BIRCH_WOODEN_STAIRS=135
181 | JUNGLE_WOOD_STAIRS=136
182 | JUNGLE_WOODEN_STAIRS=136
183 | BEACON=138
184 | COBBLE_WALL=139
185 | STONE_WALL=139
186 | COBBLESTONE_WALL=139
187 | FLOWER_POT_BLOCK=140
188 | CARROT_BLOCK=141
189 | POTATO_BLOCK=142
190 | WOODEN_BUTTON=143
191 | SKULL_BLOCK=144
192 | ANVIL=145
193 | TRAPPED_CHEST=146
194 | LIGHT_WEIGHTED_PRESSURE_PLATE=147
195 | HEAVY_WEIGHTED_PRESSURE_PLATE=148
196 | UNPOWERED_COMPARATOR=149
197 | POWERED_COMPARATOR=150
198 | DAYLIGHT_DETECTOR=151
199 | REDSTONE_BLOCK=152
200 | QUARTZ_ORE=153
201 | HOPPER_BLOCK=154
202 | QUARTZ_BLOCK=155
203 | QUARTZ_STAIRS=156
204 | DOUBLE_WOOD_SLAB=157
205 | DOUBLE_WOODEN_SLAB=157
206 | DOUBLE_WOOD_SLABS=157
207 | DOUBLE_WOODEN_SLABS=157
208 | WOOD_SLAB=158
209 | WOODEN_SLAB=158
210 | WOOD_SLABS=158
211 | WOODEN_SLABS=158
212 | STAINED_TERRACOTTA=159
213 | STAINED_HARDENED_CLAY=159
214 | STAINED_GLASS_PANE=160
215 | LEAVES2=161
216 | LEAVE2=161
217 | WOOD2=162
218 | TRUNK2=162
219 | LOG2=162
220 | ACACIA_WOOD_STAIRS=163
221 | ACACIA_WOODEN_STAIRS=163
222 | DARK_OAK_WOOD_STAIRS=164
223 | DARK_OAK_WOODEN_STAIRS=164
224 | SLIME_BLOCK=165
225 | IRON_TRAPDOOR=167
226 | PRISMARINE=168
227 | SEA_LANTERN=169
228 | HAY_BALE=170
229 | CARPET=171
230 | TERRACOTTA=172
231 | COAL_BLOCK=173
232 | PACKED_ICE=174
233 | DOUBLE_PLANT=175
234 | STANDING_BANNER=176
235 | WALL_BANNER=177
236 | DAYLIGHT_DETECTOR_INVERTED=178
237 | RED_SANDSTONE=179
238 | RED_SANDSTONE_STAIRS=180
239 | DOUBLE_RED_SANDSTONE_SLAB=181
240 | RED_SANDSTONE_SLAB=182
241 | FENCE_GATE_SPRUCE=183
242 | FENCE_GATE_BIRCH=184
243 | FENCE_GATE_JUNGLE=185
244 | FENCE_GATE_DARK_OAK=186
245 | FENCE_GATE_ACACIA=187
246 | SPRUCE_DOOR_BLOCK=193
247 | BIRCH_DOOR_BLOCK=194
248 | JUNGLE_DOOR_BLOCK=195
249 | ACACIA_DOOR_BLOCK=196
250 | DARK_OAK_DOOR_BLOCK=197
251 | GRASS_PATH=198
252 | ITEM_FRAME_BLOCK=199
253 | CHORUS_FLOWER=200
254 | PURPUR_BLOCK=201
255 | PURPUR_STAIRS=203
256 | UNDYED_SHULKER_BOX=205
257 | END_BRICKS=206
258 | ICE_FROSTED=207
259 | END_ROD=208
260 | END_GATEWAY=209
261 | MAGMA=213
262 | BLOCK_NETHER_WART_BLOCK=214
263 | RED_NETHER_BRICK=215
264 | BONE_BLOCK=216
265 | SHULKER_BOX=218
266 | PURPLE_GLAZED_TERRACOTTA=219
267 | WHITE_GLAZED_TERRACOTTA=220
268 | ORANGE_GLAZED_TERRACOTTA=221
269 | MAGENTA_GLAZED_TERRACOTTA=222
270 | LIGHT_BLUE_GLAZED_TERRACOTTA=223
271 | YELLOW_GLAZED_TERRACOTTA=224
272 | LIME_GLAZED_TERRACOTTA=225
273 | PINK_GLAZED_TERRACOTTA=226
274 | GRAY_GLAZED_TERRACOTTA=227
275 | SILVER_GLAZED_TERRACOTTA=228
276 | CYAN_GLAZED_TERRACOTTA=229
277 | BLUE_GLAZED_TERRACOTTA=231
278 | BROWN_GLAZED_TERRACOTTA=232
279 | GREEN_GLAZED_TERRACOTTA=233
280 | RED_GLAZED_TERRACOTTA=234
281 | BLACK_GLAZED_TERRACOTTA=235
282 | CONCRETE=236
283 | CONCRETE_POWDER=237
284 | CHORUS_PLANT=240
285 | STAINED_GLASS=241
286 | PODZOL=243
287 | BEETROOT_BLOCK=244
288 | STONECUTTER=245
289 | GLOWING_OBSIDIAN=246
290 | NETHER_REACTOR=247
291 | MOVING_BLOCK=250
292 | OBSERVER=251
293 | PRISMARINE_STAIRS=257
294 | DARK_PRISMARINE_STAIRS=258
295 | PRISMARINE_BRICKS_STAIRS=259
296 | STRIPPED_SPRUCE_LOG=260
297 | STRIPPED_BIRCH_LOG=261
298 | STRIPPED_JUNGLE_LOG=262
299 | STRIPPED_ACACIA_LOG=263
300 | STRIPPED_DARK_OAK_LOG=264
301 | STRIPPED_OAK_LOG=265
302 | BLUE_ICE=266
303 | SEAGRASS=385
304 | CORAL=386
305 | CORAL_BLOCK=387
306 | CORAL_FAN=388
307 | CORAL_FAN_DEAD=389
308 | CORAL_FAN_HANG=390
309 | CORAL_FAN_HANG2=391
310 | CORAL_FAN_HANG3=392
311 | BLOCK_KELP=393
312 | DRIED_KELP_BLOCK=394
313 | ACACIA_BUTTON=395
314 | BIRCH_BUTTON=396
315 | DARK_OAK_BUTTON=397
316 | JUNGLE_BUTTON=398
317 | SPRUCE_BUTTON=399
318 | ACACIA_TRAPDOOR=400
319 | BIRCH_TRAPDOOR=401
320 | DARK_OAK_TRAPDOOR=402
321 | JUNGLE_TRAPDOOR=403
322 | SPRUCE_TRAPDOOR=404
323 | ACACIA_PRESSURE_PLATE=405
324 | BIRCH_PRESSURE_PLATE=406
325 | DARK_OAK_PRESSURE_PLATE=407
326 | JUNGLE_PRESSURE_PLATE=408
327 | SPRUCE_PRESSURE_PLATE=409
328 | CARVED_PUMPKIN=410
329 | SEA_PICKLE=411
330 | CONDUIT=412
331 | TURTLE_EGG=414
332 | BUBBLE_COLUMN=415
333 | BARRIER=416
334 | STONE_SLAB3=417
335 | BAMBOO=418
336 | BAMBOO_SAPLING=419
337 | SCAFFOLDING=420
338 | STONE_SLAB4=421
339 | DOUBLE_STONE_SLAB3=422
340 | DOUBLE_STONE_SLAB4=423
341 | GRANITE_STAIRS=424
342 | DIORITE_STAIRS=425
343 | ANDESITE_STAIRS=426
344 | POLISHED_GRANITE_STAIRS=427
345 | POLISHED_DIORITE_STAIRS=428
346 | POLISHED_ANDESITE_STAIRS=429
347 | MOSSY_STONE_BRICK_STAIRS=430
348 | SMOOTH_RED_SANDSTONE_STAIRS=431
349 | SMOOTH_SANDSTONE_STAIRS=432
350 | END_BRICK_STAIRS=433
351 | MOSSY_COBBLESTONE_STAIRS=434
352 | NORMAL_STONE_STAIRS=435
353 | SPRUCE_STANDING_SIGN=436
354 | SPRUCE_WALL_SIGN=437
355 | SMOOTH_STONE=438
356 | RED_NETHER_BRICK_STAIRS=439
357 | SMOOTH_QUARTZ_STAIRS=440
358 | BIRCH_STANDING_SIGN=441
359 | BIRCH_WALL_SIGN=442
360 | JUNGLE_STANDING_SIGN=443
361 | JUNGLE_WALL_SIGN=444
362 | ACACIA_STANDING_SIGN=445
363 | ACACIA_WALL_SIGN=446
364 | DARKOAK_STANDING_SIGN=447
365 | DARK_OAK_STANDING_SIGN=447
366 | DARKOAK_WALL_SIGN=448
367 | DARK_OAK_WALL_SIGN=448
368 | LECTERN=449
369 | GRINDSTONE=450
370 | BLAST_FURNACE=451
371 | STONECUTTER_BLOCK=452
372 | SMOKER=453
373 | LIT_SMOKER=454
374 | CARTOGRAPHY_TABLE=455
375 | FLETCHING_TABLE=456
376 | SMITHING_TABLE=457
377 | BARREL=458
378 | LOOM=459
379 | BELL=461
380 | SWEET_BERRY_BUSH=462
381 | LANTERN=463
382 | CAMPFIRE_BLOCK=464
383 | LAVA_CAULDRON=465
384 | JIGSAW=466
385 | WOOD_BARK=467
386 | COMPOSTER=468
387 | LIT_BLAST_FURNACE=469
388 | LIGHT_BLOCK=470
389 | WITHER_ROSE=471
390 | STICKYPISTONARMCOLLISION=472
391 | PISTON_HEAD_STICKY=472
392 | BEE_NEST=473
393 | BEEHIVE=474
394 | HONEY_BLOCK=475
395 | HONEYCOMB_BLOCK=476
396 |
--------------------------------------------------------------------------------
/src/main/resources/powernukkit-item-ids.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | IRON_SHOVEL=256
3 | IRON_PICKAXE=257
4 | IRON_AXE=258
5 | FLINT_STEEL=259
6 | FLINT_AND_STEEL=259
7 | APPLE=260
8 | BOW=261
9 | ARROW=262
10 | COAL=263
11 | DIAMOND=264
12 | IRON_INGOT=265
13 | GOLD_INGOT=266
14 | IRON_SWORD=267
15 | WOODEN_SWORD=268
16 | WOODEN_SHOVEL=269
17 | WOODEN_PICKAXE=270
18 | WOODEN_AXE=271
19 | STONE_SWORD=272
20 | STONE_SHOVEL=273
21 | STONE_PICKAXE=274
22 | STONE_AXE=275
23 | DIAMOND_SWORD=276
24 | DIAMOND_SHOVEL=277
25 | DIAMOND_PICKAXE=278
26 | DIAMOND_AXE=279
27 | STICK=280
28 | STICKS=280
29 | BOWL=281
30 | MUSHROOM_STEW=282
31 | GOLD_SWORD=283
32 | GOLDEN_SWORD=283
33 | GOLD_SHOVEL=284
34 | GOLDEN_SHOVEL=284
35 | GOLD_PICKAXE=285
36 | GOLDEN_PICKAXE=285
37 | GOLD_AXE=286
38 | GOLDEN_AXE=286
39 | STRING=287
40 | FEATHER=288
41 | GUNPOWDER=289
42 | WOODEN_HOE=290
43 | STONE_HOE=291
44 | IRON_HOE=292
45 | DIAMOND_HOE=293
46 | GOLD_HOE=294
47 | GOLDEN_HOE=294
48 | SEEDS=295
49 | WHEAT_SEEDS=295
50 | WHEAT=296
51 | BREAD=297
52 | LEATHER_CAP=298
53 | LEATHER_TUNIC=299
54 | LEATHER_PANTS=300
55 | LEATHER_BOOTS=301
56 | CHAIN_HELMET=302
57 | CHAIN_CHESTPLATE=303
58 | CHAIN_LEGGINGS=304
59 | CHAIN_BOOTS=305
60 | IRON_HELMET=306
61 | IRON_CHESTPLATE=307
62 | IRON_LEGGINGS=308
63 | IRON_BOOTS=309
64 | DIAMOND_HELMET=310
65 | DIAMOND_CHESTPLATE=311
66 | DIAMOND_LEGGINGS=312
67 | DIAMOND_BOOTS=313
68 | GOLD_HELMET=314
69 | GOLD_CHESTPLATE=315
70 | GOLD_LEGGINGS=316
71 | GOLD_BOOTS=317
72 | FLINT=318
73 | RAW_PORKCHOP=319
74 | COOKED_PORKCHOP=320
75 | PAINTING=321
76 | GOLDEN_APPLE=322
77 | SIGN=323
78 | WOODEN_DOOR=324
79 | BUCKET=325
80 | MINECART=328
81 | SADDLE=329
82 | IRON_DOOR=330
83 | REDSTONE=331
84 | REDSTONE_DUST=331
85 | SNOWBALL=332
86 | BOAT=333
87 | LEATHER=334
88 | KELP=335
89 | BRICK=336
90 | CLAY=337
91 | SUGARCANE=338
92 | SUGAR_CANE=338
93 | SUGAR_CANES=338
94 | PAPER=339
95 | BOOK=340
96 | SLIMEBALL=341
97 | MINECART_WITH_CHEST=342
98 | EGG=344
99 | COMPASS=345
100 | FISHING_ROD=346
101 | CLOCK=347
102 | GLOWSTONE_DUST=348
103 | RAW_FISH=349
104 | COOKED_FISH=350
105 | DYE=351
106 | BONE=352
107 | SUGAR=353
108 | CAKE=354
109 | BED=355
110 | REPEATER=356
111 | COOKIE=357
112 | MAP=358
113 | SHEARS=359
114 | MELON=360
115 | MELON_SLICE=360
116 | PUMPKIN_SEEDS=361
117 | MELON_SEEDS=362
118 | RAW_BEEF=363
119 | STEAK=364
120 | COOKED_BEEF=364
121 | RAW_CHICKEN=365
122 | COOKED_CHICKEN=366
123 | ROTTEN_FLESH=367
124 | ENDER_PEARL=368
125 | BLAZE_ROD=369
126 | GHAST_TEAR=370
127 | GOLD_NUGGET=371
128 | GOLDEN_NUGGET=371
129 | NETHER_WART=372
130 | POTION=373
131 | GLASS_BOTTLE=374
132 | BOTTLE=374
133 | SPIDER_EYE=375
134 | FERMENTED_SPIDER_EYE=376
135 | BLAZE_POWDER=377
136 | MAGMA_CREAM=378
137 | BREWING_STAND=379
138 | BREWING=379
139 | CAULDRON=380
140 | ENDER_EYE=381
141 | GLISTERING_MELON=382
142 | SPAWN_EGG=383
143 | EXPERIENCE_BOTTLE=384
144 | FIRE_CHARGE=385
145 | BOOK_AND_QUILL=386
146 | WRITTEN_BOOK=387
147 | EMERALD=388
148 | ITEM_FRAME=389
149 | FLOWER_POT=390
150 | CARROT=391
151 | CARROTS=391
152 | POTATO=392
153 | POTATOES=392
154 | BAKED_POTATO=393
155 | BAKED_POTATOES=393
156 | POISONOUS_POTATO=394
157 | EMPTY_MAP=395
158 | GOLDEN_CARROT=396
159 | SKULL=397
160 | CARROT_ON_A_STICK=398
161 | NETHER_STAR=399
162 | PUMPKIN_PIE=400
163 | FIREWORKS=401
164 | FIREWORKSCHARGE=402
165 | ENCHANTED_BOOK=403
166 | ENCHANT_BOOK=403
167 | COMPARATOR=404
168 | NETHER_BRICK=405
169 | QUARTZ=406
170 | NETHER_QUARTZ=406
171 | MINECART_WITH_TNT=407
172 | MINECART_WITH_HOPPER=408
173 | PRISMARINE_SHARD=409
174 | HOPPER=410
175 | RAW_RABBIT=411
176 | COOKED_RABBIT=412
177 | RABBIT_STEW=413
178 | RABBIT_FOOT=414
179 | RABBIT_HIDE=415
180 | LEATHER_HORSE_ARMOR=416
181 | IRON_HORSE_ARMOR=417
182 | GOLD_HORSE_ARMOR=418
183 | DIAMOND_HORSE_ARMOR=419
184 | LEAD=420
185 | NAME_TAG=421
186 | PRISMARINE_CRYSTALS=422
187 | RAW_MUTTON=423
188 | COOKED_MUTTON=424
189 | ARMOR_STAND=425
190 | END_CRYSTAL=426
191 | SPRUCE_DOOR=427
192 | BIRCH_DOOR=428
193 | JUNGLE_DOOR=429
194 | ACACIA_DOOR=430
195 | DARK_OAK_DOOR=431
196 | CHORUS_FRUIT=432
197 | POPPED_CHORUS_FRUIT=433
198 | DRAGON_BREATH=437
199 | SPLASH_POTION=438
200 | LINGERING_POTION=441
201 | COMMAND_BLOCK_MINECART=443
202 | ELYTRA=444
203 | SHULKER_SHELL=445
204 | BANNER=446
205 | TOTEM=450
206 | IRON_NUGGET=452
207 | TRIDENT=455
208 | BEETROOT=457
209 | BEETROOT_SEEDS=458
210 | BEETROOT_SEED=458
211 | BEETROOT_SOUP=459
212 | RAW_SALMON=460
213 | CLOWNFISH=461
214 | PUFFERFISH=462
215 | COOKED_SALMON=463
216 | DRIED_KELP=464
217 | NAUTILUS_SHELL=465
218 | GOLDEN_APPLE_ENCHANTED=466
219 | HEART_OF_THE_SEA=467
220 | SCUTE=468
221 | TURTLE_SHELL=469
222 | PHANTOM_MEMBRANE=470
223 | CROSSBOW=471
224 | SPRUCE_SIGN=472
225 | BIRCH_SIGN=473
226 | JUNGLE_SIGN=474
227 | ACACIA_SIGN=475
228 | DARKOAK_SIGN=476
229 | DARK_OAK_SIGN=476
230 | SWEET_BERRIES=477
231 | RECORD_13=500
232 | RECORD_CAT=501
233 | RECORD_BLOCKS=502
234 | RECORD_CHIRP=503
235 | RECORD_FAR=504
236 | RECORD_MALL=505
237 | RECORD_MELLOHI=506
238 | RECORD_STAL=507
239 | RECORD_STRAD=508
240 | RECORD_WARD=509
241 | RECORD_11=510
242 | RECORD_WAIT=511
243 | SHIELD=513
244 | CAMPFIRE=720
245 | SUSPICIOUS_STEW=734
246 | HONEYCOMB=736
247 | HONEY_BOTTLE=737
248 |
--------------------------------------------------------------------------------
/src/main/resources/status-effect-ids.properties:
--------------------------------------------------------------------------------
1 | # Generated on Minecraft 1.14 at 2019-05-18 16:44:19 BRT
2 | # suppress inspection "UnusedProperty" for whole file
3 | speed=1
4 | slowness=2
5 | haste=3
6 | mining_fatigue=4
7 | strength=5
8 | instant_health=6
9 | instant_damage=7
10 | jump_boost=8
11 | nausea=9
12 | regeneration=10
13 | resistance=11
14 | fire_resistance=12
15 | water_breathing=13
16 | invisibility=14
17 | blindness=15
18 | night_vision=16
19 | hunger=17
20 | weakness=18
21 | poison=19
22 | wither=20
23 | health_boost=21
24 | absorption=22
25 | saturation=23
26 | glowing=0
27 | levitation=24
28 | luck=0
29 | unluck=0
30 | slow_falling=27
31 | conduit_power=26
32 | dolphins_grace=0
33 | bad_omen=28
34 | hero_of_the_village=29
35 |
--------------------------------------------------------------------------------
/src/main/resources/status-effect-java-ids.properties:
--------------------------------------------------------------------------------
1 | # Generated on Minecraft 1.14 at 2019-05-18 16:52:06 BRT
2 | 1=speed
3 | 2=slowness
4 | 3=haste
5 | 4=mining_fatigue
6 | 5=strength
7 | 6=instant_health
8 | 7=instant_damage
9 | 8=jump_boost
10 | 9=nausea
11 | 10=regeneration
12 | 11=resistance
13 | 12=fire_resistance
14 | 13=water_breathing
15 | 14=invisibility
16 | 15=blindness
17 | 16=night_vision
18 | 17=hunger
19 | 18=weakness
20 | 19=poison
21 | 20=wither
22 | 21=health_boost
23 | 22=absorption
24 | 23=saturation
25 | 24=glowing
26 | 25=levitation
27 | 26=luck
28 | 27=unluck
29 | 28=slow_falling
30 | 29=conduit_power
31 | 30=dolphins_grace
32 | 31=bad_omen
33 | 32=hero_of_the_village
34 |
--------------------------------------------------------------------------------
/src/main/resources/tags.properties:
--------------------------------------------------------------------------------
1 | acacia_logs=acacia_log, acacia_wood, stripped_acacia_log, stripped_acacia_wood
2 | anvil=anvil, chipped_anvil, damaged_anvil
3 | banners=white_banner, orange_banner, magenta_banner, light_blue_banner, yellow_banner, lime_banner, pink_banner, gray_banner, light_gray_banner, cyan_banner, purple_banner, blue_banner, brown_banner, green_banner, red_banner, black_banner, white_wall_banner, orange_wall_banner, magenta_wall_banner, light_blue_wall_banner, yellow_wall_banner, lime_wall_banner, pink_wall_banner, gray_wall_banner, light_gray_wall_banner, cyan_wall_banner, purple_wall_banner, blue_wall_banner, brown_wall_banner, green_wall_banner, red_wall_banner, black_wall_banner
4 | bamboo_plantable_on=bamboo, bamboo_sapling, gravel, #sand, #dirt_like
5 | birch_logs=birch_log, birch_bark, stripped_birch_log, stripped_birch_bark
6 | beds=red_bed, black_bed, blue_bed, brown_bed, cyan_bed, gray_bed, green_bed, light_blue_bed, light_gray_bed, lime_bed, magenta_bed, orange_bed, pink_bed, purple_bed, white_bed, yellow_bed
7 | buttons=#wooden_buttons, stone_button
8 | carpets=white_carpet, orange_carpet, magenta_carpet, light_blue_carpet, yellow_carpet, lime_carpet, pink_carpet, gray_carpet, light_gray_carpet, cyan_carpet, purple_carpet, blue_carpet, brown_carpet, green_carpet, red_carpet, black_carpet
9 | coral_blocks=tube_coral_block, brain_coral_block, bubble_coral_block, fire_coral_block, horn_coral_block
10 | corals=tube_coral, brain_coral, bubble_coral, fire_coral, horn_coral, tube_coral_fan, brain_coral_fan, bubble_coral_fan, fire_coral_fan, horn_coral_fan
11 | dark_oak_logs=dark_oak_log, dark_oak_bark, stripped_dark_oak_log, stripped_dark_oak_bark
12 | dirt_like=dirt, grass_block, podzol, coarse_dirt, mycelium
13 | doors=#wooden_doors, iron_door
14 | dragon_immune=barrier, bedrock, end_portal, end_portal_frame, end_gateway, command_block, repeating_command_block, chain_command_block, structure_block, jigsaw, moving_piston, obsidian, end_stone, iron_bars
15 | enderman_holdable=grass_block, dirt, coarse_dirt, podzol, sand, red_sand, gravel, dandelion, poppy, blue_orchid, allium, azure_bluet, red_tulip, orange_tulip, white_tulip, pink_tulip, oxeye_daisy, brown_mushroom, red_mushroom, tnt, cactus, clay, pumpkin, carved_pumpkin, melon_block, mycelium, netherrack, #small_flowers, grass_block, dirt, coarse_dirt, podzol, sand, red_sand, gravel, brown_mushroom, red_mushroom, tnt, cactus, clay, pumpkin, carved_pumpkin, melon, mycelium, netherrack
16 | flower_pots=flower_pot, potted_poppy, potted_blue_orchid, potted_allium, potted_azure_bluet, potted_red_tulip, potted_orange_tulip, potted_white_tulip, potted_pink_tulip, potted_oxeye_daisy, potted_dandelion, potted_oak_sapling, potted_spruce_sapling, potted_birch_sapling, potted_jungle_sapling, potted_acacia_sapling, potted_dark_oak_sapling, potted_red_mushroom, potted_brown_mushroom, potted_dead_bush, potted_fern, potted_cactus, flower_pot, potted_poppy, potted_blue_orchid, potted_allium, potted_azure_bluet, potted_red_tulip, potted_orange_tulip, potted_white_tulip, potted_pink_tulip, potted_oxeye_daisy, potted_dandelion, potted_oak_sapling, potted_spruce_sapling, potted_birch_sapling, potted_jungle_sapling, potted_acacia_sapling, potted_dark_oak_sapling, potted_red_mushroom, potted_brown_mushroom, potted_dead_bush, potted_fern, potted_cactus, potted_cornflower, potted_lily_of_the_valley, potted_wither_rose, potted_bamboo
17 | ice=ice, packed_ice, blue_ice, frosted_ice
18 | impermeable=glass, white_stained_glass, orange_stained_glass, magenta_stained_glass, light_blue_stained_glass, yellow_stained_glass, lime_stained_glass, pink_stained_glass, gray_stained_glass, light_gray_stained_glass, cyan_stained_glass, purple_stained_glass, blue_stained_glass, brown_stained_glass, green_stained_glass, red_stained_glass, black_stained_glass
19 | jungle_logs=jungle_log, jungle_bark, stripped_jungle_log, stripped_jungle_bark
20 | leaves=jungle_leaves, oak_leaves, spruce_leaves, dark_oak_leaves, acacia_leaves, birch_leaves
21 | logs=#dark_oak_logs, #oak_logs, #acacia_logs, #birch_logs, #jungle_logs, #spruce_logs
22 | oak_logs=oak_log, oak_bark, stripped_oak_log, stripped_oak_bark
23 | planks=oak_planks, spruce_planks, birch_planks, jungle_planks, acacia_planks, dark_oak_planks
24 | rails=rail, powered_rail, detector_rail, activator_rail
25 | sand=sand, red_sand
26 | saplings=oak_sapling, spruce_sapling, birch_sapling, jungle_sapling, acacia_sapling, dark_oak_sapling
27 | signs=#standing_signs, #wall_signs
28 | slabs=stone_slab, stone_brick_slab, sandstone_slab, acacia_slab, birch_slab, dark_oak_slab, jungle_slab, oak_slab, spruce_slab, purpur_slab, quartz_slab, red_sandstone_slab, brick_slab, cobblestone_slab, nether_brick_slab, petrified_oak_slab, prismarine_slab, prismarine_bricks_slab, dark_prismarine_slab, stone_slab, smooth_stone_slab, stone_brick_slab, sandstone_slab, acacia_slab, birch_slab, dark_oak_slab, jungle_slab, oak_slab, spruce_slab, purpur_slab, quartz_slab, red_sandstone_slab, brick_slab, cobblestone_slab, nether_brick_slab, petrified_oak_slab, prismarine_slab, prismarine_brick_slab, dark_prismarine_slab, polished_granite_slab, smooth_red_sandstone_slab, mossy_stone_brick_slab, polished_diorite_slab, mossy_cobblestone_slab, end_stone_brick_slab, smooth_sandstone_slab, smooth_quartz_slab, granite_slab, andesite_slab, red_nether_brick_slab, polished_andesite_slab, diorite_slab
29 | small_flowers=dandelion, poppy, blue_orchid, allium, azure_bluet, red_tulip, orange_tulip, white_tulip, pink_tulip, oxeye_daisy, cornflower, lily_of_the_valley, wither_rose
30 | spruce_logs=spruce_log, spruce_bark, stripped_spruce_log, stripped_spruce_bark
31 | stairs=oak_stairs, cobblestone_stairs, spruce_stairs, sandstone_stairs, acacia_stairs, jungle_stairs, birch_stairs, dark_oak_stairs, nether_brick_stairs, stone_brick_stairs, brick_stairs, purpur_stairs, quartz_stairs, red_sandstone_stairs, prismarine_bricks_stairs, prismarine_stairs, dark_prismarine_stairs, oak_stairs, cobblestone_stairs, spruce_stairs, sandstone_stairs, acacia_stairs, jungle_stairs, birch_stairs, dark_oak_stairs, nether_brick_stairs, stone_brick_stairs, brick_stairs, purpur_stairs, quartz_stairs, red_sandstone_stairs, prismarine_brick_stairs, prismarine_stairs, dark_prismarine_stairs, polished_granite_stairs, smooth_red_sandstone_stairs, mossy_stone_brick_stairs, polished_diorite_stairs, mossy_cobblestone_stairs, end_stone_brick_stairs, stone_stairs, smooth_sandstone_stairs, smooth_quartz_stairs, granite_stairs, andesite_stairs, red_nether_brick_stairs, polished_andesite_stairs, diorite_stairs
32 | standing_signs=oak_sign, spruce_sign, birch_sign, acacia_sign, jungle_sign, dark_oak_sign
33 | stone_bricks=stone_bricks, mossy_stone_bricks, cracked_stone_bricks, chiseled_stone_bricks
34 | underwater_bonemeals=seagrass, #corals, #wall_corals
35 | valid_spawn=grass_block, podzol
36 | wall_signs=oak_wall_sign, spruce_wall_sign, birch_wall_sign, acacia_wall_sign, jungle_wall_sign, dark_oak_wall_sign
37 | wall_corals=tube_coral_wall_fan, brain_coral_wall_fan, bubble_coral_wall_fan, fire_coral_wall_fan, horn_coral_wall_fan
38 | walls=cobblestone_wall, mossy_cobblestone_wall, brick_wall, prismarine_wall, red_sandstone_wall, mossy_stone_brick_wall, granite_wall, stone_brick_wall, nether_brick_wall ,andesite_wall ,red_nether_brick_wall, sandstone_wall, end_stone_brick_wall, diorite_wall
39 | wither_immune=barrier, bedrock, end_portal, end_portal_frame, end_gateway, command_block, repeating_command_block, chain_command_block, structure_block, jigsaw, moving_piston, obsidian, end_stone, iron_bars
40 | wooden_buttons=oak_button, spruce_button, birch_button, jungle_button, acacia_button, dark_oak_button
41 | wooden_doors=oak_door, spruce_door, birch_door, jungle_door, acacia_door, dark_oak_door
42 | wooden_pressure_plates=oak_pressure_plate, spruce_pressure_plate, birch_pressure_plate, jungle_pressure_plate, acacia_pressure_plate, dark_oak_pressure_plate
43 | wooden_slabs=oak_slab, spruce_slab, birch_slab, jungle_slab, acacia_slab, dark_oak_slab
44 | wooden_stairs=oak_stairs, spruce_stairs, birch_stairs, jungle_stairs, acacia_stairs, dark_oak_stairs
45 | wool=white_wool, orange_wool, magenta_wool, light_blue_wool, yellow_wool, lime_wool, pink_wool, gray_wool, light_gray_wool, cyan_wool, purple_wool, blue_wool, brown_wool, green_wool, red_wool, black_wool
46 |
--------------------------------------------------------------------------------
/src/main/resources/tipped-arrows.properties:
--------------------------------------------------------------------------------
1 | # suppress inspection "UnusedProperty" for whole file
2 | night_vision=6
3 | long_night_vision=7
4 | invisibility=8
5 | long_invisibility=9
6 | leaping=10
7 | long_leaping=11
8 | strong_leaping=12
9 | fire_resistance=13
10 | long_fire_resistance=14
11 | swiftness=15
12 | long_swiftness=16
13 | strong_swiftness=17
14 | slowness=18
15 | long_slowness=19
16 | # Unsupported by Bedrock Edition, converting to normal
17 | strong_slowness=19
18 | water_breathing=20
19 | long_water_breathing=21
20 | healing=22
21 | strong_healing=23
22 | harming=24
23 | strong_harming=25
24 | poison=26
25 | long_poison=27
26 | strong_poison=28
27 | regeneration=29
28 | long_regeneration=30
29 | strong_regeneration=31
30 | strength=32
31 | long_strength=33
32 | strong_strength=34
33 | weakness=35
34 | long_weakness=36
35 | decay=37
36 | turtle_master=38
37 | long_turtle_master=39
38 | strong_turtle_master=40
39 | slow_falling=41
40 | long_slow_falling=42
41 |
--------------------------------------------------------------------------------
/src/pages/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-hacker
2 |
--------------------------------------------------------------------------------
/src/pages/assets/css/style.scss:
--------------------------------------------------------------------------------
1 | ---
2 | ---
3 |
4 | @import "{{ site.theme }}";
5 | code.highlighter-rouge {
6 | color: #d0d0d0;
7 | }
8 |
--------------------------------------------------------------------------------
/src/test/kotlin/.gitignore:
--------------------------------------------------------------------------------
1 | privado
--------------------------------------------------------------------------------
/src/test/kotlin/br/com/gamemods/j2nwc/JsonTest.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc
2 |
3 | import br.com.gamemods.j2nwc.internal.fromJsonToLegacy
4 | import org.junit.Test
5 |
6 | class JsonTest {
7 | @Test
8 | fun test() {
9 | println("".fromJsonToLegacy())
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/test/kotlin/br/com/gamemods/j2nwc/RegionTest.kt:
--------------------------------------------------------------------------------
1 | package br.com.gamemods.j2nwc
2 |
3 | import br.com.gamemods.j2nwc.internal.toNukkit
4 | import br.com.gamemods.regionmanipulator.RegionIO
5 | import br.com.gamemods.regionmanipulator.RegionPos
6 | import org.junit.Test
7 | import java.io.File
8 |
9 | class RegionTest {
10 | @Test
11 | fun testReadMCA() {
12 | val tempFile = File.createTempFile("r.1,-1,", ".mca")
13 | tempFile.deleteOnExit()
14 | RegionTest::class.java.getResourceAsStream("/r.1.-1.mca").use { input ->
15 | tempFile.outputStream().use { output ->
16 | input.copyTo(output)
17 | }
18 | }
19 |
20 | val mca = RegionIO.readRegion(tempFile, RegionPos(1, -1))
21 | mca.toNukkit(mutableListOf(), WorldConverter(tempFile, tempFile))
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/src/test/resources/r.1.-1.mca:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PowerNukkit/Java2Nukkit-World-Converter/8d154d1e4bae336cd2e4542a4d2bb4cc98f9e291/src/test/resources/r.1.-1.mca
--------------------------------------------------------------------------------