Shulkr is a tool that decompiles multiple versions of Minecraft and commits each version to Git
Warning: You CANNOT publish any code generated by this tool. For more info, see the usage guidelines.
- Git
- Python 3
- JDK (>= 17 for Minecraft 1.18 and above)
pip install shulkr
shulkr 1.16 1.17 1.18
This will generate a commit with the decompiled source code for Minecraft 1.16, 1.17 and 1.18 in the current working directory:
204b37c (HEAD -> main, tag: 1.18) version 1.18
86dc440 (tag: 1.17) version 1.17
5d13494 (tag: 1.16) version 1.16
Note: It's okay to skip versions. Shulkr generates the complete source code for each version before committing to git, so you can include as many or as little intermediate versions as you would like.
Ranges of versions can be specified with ..
and ...
:
A..B
expands to all versions betweenA
andB
(inclusive), not including snapshotsA...B
expands to all versions betweenA
andB
(inclusive), including snapshots
A
and/or B
can be omitted, defaulting to the version after the most recent
commit and the latest supported version, respectively.
A negative pattern removes all matching versions that came before it. To
negate a pattern, add -
. The following pattern expands to all versions after
A
, up to and including B
(the order is important):
A...B -A
Note that you need to include --
before the versions when using negative
versions, so the argument parser knows that the negative version is not an
option:
shulkr -- ...1.19 -1.19
By default the source code is generated in the current working directory. To specify a different location:
shulkr --repo minecraft-sources 1.17..
If the directory does not exist, a new git repo will be created there.
By default, Minecraft's bytecode is deobfuscated using yarn's mappings. You
can also use --mappings mojang
to use Mojang's official mappings.
If left unspecified, the mappings used to generate the previous commit are detected.
This option lets you customize the commit message format:
shulkr -m "Minecraft {}" 1.18-rc4
By default, each commit is tagged with the name of its Minecraft version. This
can be disabled with --no-tags
.
When this option is enabled, local variables that were renamed in new versions will be reverted to their original names.
See the changelog.
See the contributing guide.
Licensed under the Apache License, Version 2.0.