geforkt von Mirrors/Paper
963393ce85
When Mojang added 1.13.2-pre2 to their manifest page it exposed a flaw in the way the script's regex was getting the version json manifest. I've tweaked the regex such that it will always first get the version entry and then use that entry to get the json url, rather than trying to do the whole thing in one shot. Fixes GH-1582
149 Zeilen
5.1 KiB
Bash
Ausführbare Datei
149 Zeilen
5.1 KiB
Bash
Ausführbare Datei
#!/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')
|
|
echo $verescaped
|
|
verentry=$(curl -s "https://launchermeta.mojang.com/mc/game/version_manifest.json" | grep -oE "{\"id\": \"${verescaped}\".*?\.json")
|
|
echo $verentry
|
|
jsonurl=$(echo $verentry | grep -oE https:\/\/.*?\.json)
|
|
echo $jsonurl
|
|
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
|
|
|
|
)
|