├── .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 --------------------------------------------------------------------------------