mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-24 16:18:02 +01:00
b26af23d2d
Some flavours of grep don't like '?' in their expressions (also `.*?` means "match zero or more times or maybe do not match at all" as far as I know).
145 lines
5 KiB
Bash
Executable file
145 lines
5 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
(
|
|
set -e
|
|
PS1="$"
|
|
basedir="$(cd "$1" && pwd -P)"
|
|
workdir="$basedir/work"
|
|
minecraftversion=$(cat "$workdir/BuildData/info.json" | grep minecraftVersion | cut -d '"' -f 4)
|
|
windows="$([[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" ]] && echo "true" || echo "false")"
|
|
decompiledir="$workdir/Minecraft/$minecraftversion"
|
|
spigotdecompiledir="$decompiledir/spigot"
|
|
forgedecompiledir="$decompiledir/forge"
|
|
forgeflowerversion="1.5.380.19"
|
|
forgeflowerurl="http://files.minecraftforge.net/maven/net/minecraftforge/forgeflower/$forgeflowerversion/forgeflower-$forgeflowerversion.jar"
|
|
# temp use patched version
|
|
forgeflowerurl="https://zachbr.keybase.pub/paper/forgeflower-patched/forgeflower-1.5.380.19.jar?dl=1"
|
|
forgeflowerbin="$workdir/ForgeFlower/$forgeflowerversion.jar"
|
|
# TODO: Make this better? We don't need spigot compat for this stage
|
|
forgefloweroptions="-dgs=1 -hdc=0 -asc=1 -udv=1 -jvn=1"
|
|
forgeflowercachefile="$decompiledir/forgeflowercache"
|
|
forgeflowercachevalue="$forgeflowerurl - $forgeflowerversion - $forgefloweroptions";
|
|
classdir="$decompiledir/classes"
|
|
versionjson="$workdir/Minecraft/$minecraftversion/$minecraftversion.json"
|
|
|
|
if [ ! -f "$versionjson" ]; then
|
|
echo "Downloading $minecraftversion JSON Data"
|
|
verescaped=$(echo ${minecraftversion} | sed 's/\./\\./g')
|
|
verentry=$(curl -s "https://launchermeta.mojang.com/mc/game/version_manifest.json" | grep -oE "{\"id\": \"${verescaped}\".*${verescaped}\.json")
|
|
jsonurl=$(echo $verentry | grep -oE https:\/\/.*\.json)
|
|
curl -o "$versionjson" "$jsonurl"
|
|
echo "$versionjson - $jsonurl"
|
|
fi
|
|
|
|
function downloadLibraries {
|
|
group=$1
|
|
groupesc=$(echo ${group} | sed 's/\./\\./g')
|
|
grouppath=$(echo ${group} | sed 's/\./\//g')
|
|
libdir="$decompiledir/libraries/${group}/"
|
|
mkdir -p "$libdir"
|
|
shift
|
|
for lib in "$@"
|
|
do
|
|
jar="$libdir/${lib}-sources.jar"
|
|
destlib="$libdir/${lib}"
|
|
if [ ! -f "$jar" ]; then
|
|
libesc=$(echo ${lib} | sed 's/\./\\]./g')
|
|
ver=$(grep -oE "${groupesc}:${libesc}:[0-9\.]+" "$versionjson" | sed "s/${groupesc}:${libesc}://g")
|
|
echo "Downloading ${group}:${lib}:${ver} Sources"
|
|
curl -s -o "$jar" "https://libraries.minecraft.net/${grouppath}/${lib}/${ver}/${lib}-${ver}-sources.jar"
|
|
set +e
|
|
grep "<html>" "$jar" && grep -oE "<title>.*?</title>" "$jar" && rm "$jar" && echo "Failed to download $jar" && exit 1
|
|
set -e
|
|
fi
|
|
|
|
if [ ! -d "$destlib/$grouppath" ]; then
|
|
echo "Extracting $group:$lib Sources"
|
|
mkdir -p "$destlib"
|
|
(cd "$destlib" && jar xf "$jar")
|
|
fi
|
|
done
|
|
}
|
|
|
|
downloadLibraries "com.mojang" datafixerupper authlib brigadier
|
|
|
|
# prep folders
|
|
mkdir -p "$workdir/ForgeFlower"
|
|
mkdir -p "$spigotdecompiledir"
|
|
mkdir -p "$forgedecompiledir"
|
|
|
|
echo "Extracting NMS classes..."
|
|
if [ ! -d "$classdir" ]; then
|
|
mkdir -p "$classdir"
|
|
cd "$classdir"
|
|
set +e
|
|
jar xf "$decompiledir/$minecraftversion-mapped.jar" net/minecraft/server
|
|
if [ "$?" != "0" ]; then
|
|
cd "$basedir"
|
|
echo "Failed to extract NMS classes."
|
|
exit 1
|
|
fi
|
|
set -e
|
|
fi
|
|
|
|
needsDecomp=0
|
|
if [ ! -f "$forgeflowercachefile" ]; then
|
|
needsDecomp=1
|
|
elif [ "$(cat ${forgeflowercachefile})" != "$forgeflowercachevalue" ]; then
|
|
needsDecomp=1
|
|
fi
|
|
if [ "$needsDecomp" == "1" ]; then
|
|
# our local cache is now invalidated, we can update forgeflower to get better deobfuscation
|
|
rm -rf "$forgedecompiledir/net"
|
|
fi
|
|
|
|
# Forge (for Paper mc-dev imports, and dev src folders for unimported files)
|
|
if [ ! -d "$forgedecompiledir/net" ] ; then
|
|
echo "Decompiling classes (stage 1)..."
|
|
cd "$basedir"
|
|
|
|
if [ ! -f "$forgeflowerbin" ]; then
|
|
echo "Downloading ForgeFlower ($forgeflowerversion)..."
|
|
curl -s -o "$forgeflowerbin" "$forgeflowerurl"
|
|
fi
|
|
|
|
set +e
|
|
java -Ddecomp.renameparams=true -jar "$forgeflowerbin" ${forgefloweroptions} -ind=' ' "$classdir" "$forgedecompiledir"
|
|
if [ "$?" != "0" ]; then
|
|
rm -rf "$forgedecompiledir/net"
|
|
echo "Failed to decompile classes."
|
|
exit 1
|
|
fi
|
|
echo "$forgeflowercachevalue" > "$forgeflowercachefile"
|
|
set -e
|
|
fi
|
|
|
|
# Spigot (for CraftBukkit patches)
|
|
|
|
# if we see the old net folder, copy it to spigot to avoid redecompiling
|
|
if [ -d "$decompiledir/net" ]; then
|
|
cp -r "$decompiledir/net" "$spigotdecompiledir/"
|
|
fi
|
|
|
|
if [ ! -d "$spigotdecompiledir/net" ]; then
|
|
echo "Decompiling classes (stage 2)..."
|
|
cd "$basedir"
|
|
set +e
|
|
java -jar "$workdir/BuildData/bin/fernflower.jar" -dgs=1 -hdc=0 -asc=1 -udv=0 "$classdir" "$spigotdecompiledir"
|
|
if [ "$?" != "0" ]; then
|
|
rm -rf "$spigotdecompiledir/net"
|
|
echo "Failed to decompile classes."
|
|
exit 1
|
|
fi
|
|
set -e
|
|
fi
|
|
|
|
# set a symlink to current
|
|
currentlink="$workdir/Minecraft/current"
|
|
if ([ ! -e "$currentlink" ] || [ -L "$currentlink" ]) && [ "$windows" == "false" ]; then
|
|
set +e
|
|
echo "Pointing $currentlink to $minecraftversion"
|
|
rm -rf "$currentlink" || true
|
|
ln -sfn "$minecraftversion" "$currentlink" || echo "Failed to set current symlink"
|
|
fi
|
|
|
|
)
|