You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
4.6 KiB
118 lines
4.6 KiB
#!/bin/bash |
|
if [[ $@ == "-h" ]] || [[ $@ == "--help" ]]; then |
|
echo "usage: ./pack-instance.sh [output]" |
|
echo "Creates a Prism Launcher compatible instance .zip file from your pack.toml." |
|
echo "If 'include' directory exists, its contents are copied to the minecraft folder." |
|
echo "If 'icon.png' exists, it's added to the pack and its instance config." |
|
echo "Output defaults to '<name>_v<version>.zip' in the current directory." |
|
exit 0 |
|
fi |
|
|
|
if ! type zip &> /dev/null; then echo "error: zip is not available on your system."; exit 1; fi |
|
if [[ ! -f "pack.toml" ]]; then echo "error: Could not find 'pack.toml'. Not in a packwiz project directory?"; exit 1; fi |
|
if [[ ! -f "pack-instance.toml" ]]; then echo "error: Could not find 'pack-instance.toml'."; exit 1; fi |
|
|
|
output="$@" |
|
start_dir=$PWD |
|
bootstrap_jar="packwiz-installer-bootstrap.jar" |
|
bootstrap_url="https://github.com/packwiz/packwiz-installer-bootstrap/releases/latest/download/$bootstrap_jar" |
|
|
|
key_string_regex='^([a-zA-Z-]+) ?= ?"(.+)"$' # To read key = "string" lines. |
|
key_integer_regex='^([a-zA-Z-]+) ?= ?([0-9]+)$' # To read key = integer lines. |
|
|
|
# Read the pack.toml file and parse it in a super simplified way. |
|
# Ideally we'd use a proper TOML parser but this should probably work. |
|
while IFS= read -r line; do |
|
if [[ $line =~ $key_string_regex ]]; then |
|
case ${BASH_REMATCH[1]} in |
|
name) name=${BASH_REMATCH[2]} ;; |
|
version) version=${BASH_REMATCH[2]} ;; |
|
minecraft) mc_version=${BASH_REMATCH[2]} ;; |
|
forge) loader="net.minecraftforge"; loader_version=${BASH_REMATCH[2]} ;; |
|
quilt) loader="org.quiltmc.quilt-loader"; loader_version=${BASH_REMATCH[2]} ;; |
|
fabric) loader="net.fabricmc.fabric-loader"; loader_version=${BASH_REMATCH[2]} ;; |
|
neoforge) loader="net.neoforged"; loader_version=${BASH_REMATCH[2]} ;; |
|
esac |
|
fi |
|
done < pack.toml |
|
|
|
if [[ -z $name ]]; then echo "error: 'name' not found in pack.toml."; exit 1; fi |
|
if [[ -z $version ]]; then echo "error: 'version' not found in pack.toml."; exit 1; fi |
|
if [[ -z $mc_version ]]; then echo "error: 'minecraft' not found in pack.toml."; exit 1; fi |
|
if [[ -z $loader ]]; then echo "error: 'forge', 'fabric or 'quilt' not found in pack.toml."; exit 1; fi |
|
|
|
# Do the same for pack-instance.toml. |
|
while IFS= read -r line; do |
|
if [[ $line =~ $key_string_regex ]]; then |
|
case ${BASH_REMATCH[1]} in |
|
url) url=${BASH_REMATCH[2]} ;; |
|
esac |
|
elif [[ $line =~ $key_integer_regex ]]; then |
|
case ${BASH_REMATCH[1]} in |
|
memory) memory=${BASH_REMATCH[2]} ;; |
|
esac |
|
fi |
|
done < pack-instance.toml |
|
|
|
if [[ -z $url ]]; then echo "error: 'url' not found in pack-instance.toml."; exit 1; fi |
|
|
|
# If no output was specified, use a default filename. |
|
if [[ -z $output ]]; then output="${name}_v${version}.zip"; fi |
|
|
|
# Create a temporary directory and move into it. |
|
tmp_dir=$(mktemp -d) |
|
if [[ ! -e $tmp_dir ]]; then echo "error: Failed to create temporary folder '$tmp_dir'."; exit 1; fi |
|
pushd $tmp_dir &> /dev/null |
|
|
|
# Download the latest packwiz bootstrapper. |
|
mkdir minecraft |
|
# -s: Silent, don't print output. |
|
# -L: Follow HTTP redirects. |
|
curl -sL -o "minecraft/$bootstrap_jar" "$bootstrap_url" |
|
|
|
# If include directory exists, copy its contents to the minecraft directory recursively. |
|
if [[ -e "$start_dir/include" ]]; then |
|
cp -r "$start_dir/include/." "minecraft" |
|
fi |
|
|
|
# Create an instance.cfg file with the necessary information for a Prism Launcher pack. |
|
cat > instance.cfg << EOF |
|
name=$name |
|
InstanceType=OneSix |
|
MCLaunchMethod=LauncherPart |
|
OverrideCommands=true |
|
PreLaunchCommand="\$INST_JAVA" -jar "$bootstrap_jar" "$url/pack.toml" |
|
EOF |
|
|
|
# If icon.png exists, append iconKey to the instance.cfg and include the icon file. |
|
if [[ -e "$start_dir/icon.png" ]]; then |
|
echo "iconKey=$name" >> instance.cfg |
|
cp "$start_dir/icon.png" "$name.png" |
|
fi |
|
|
|
# If memory is specified, append it to the instance.cfg. |
|
if [[ -n $memory ]]; then |
|
echo "MinMemAlloc=$memory" >> instance.cfg |
|
echo "MaxMemAlloc=$memory" >> instance.cfg |
|
fi |
|
|
|
# Create a minimal mmc-pack.json file. |
|
# Other dependencies should be auto-filled on first launch. |
|
cat > mmc-pack.json << EOF |
|
{ |
|
"formatVersion": 1, |
|
"components": [ |
|
{ "uid": "net.minecraft", "version": "$mc_version", "important": true }, |
|
{ "uid": "$loader", "version": "$loader_version" } |
|
] |
|
} |
|
EOF |
|
|
|
# Zip up everything from the temp directory. |
|
# -q: Quiet, don't print output. |
|
# -r: Add files recursively, Such as from minecraft/. |
|
zip -qr modpack.zip * |
|
|
|
popd &> /dev/null # Return to the starting directory. |
|
mv "$tmp_dir/modpack.zip" "$output" # Move .zip file to desired location. |
|
rm -rf $tmp_dir # Remove the temp directory.
|
|
|