mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-26 20:46:59 +01:00
dcc764db21
Apparently grep was being greedy even when it shouldn't. This ensures it doesn't be too greedy.
146 lines
5.0 KiB
Bash
Executable File
146 lines
5.0 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
|
|
|
|
)
|